- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果我并排放置两个调用来确定最小可测量持续时间:
// g++ -std=c++11 -O3 -Wall test.cpp
#include <chrono>
typedef std::chrono::high_resolution_clock hrc;
hrc::time_point start = hrc::now();
hrc::time_point end = hrc::now();
std::chrono::nanoseconds duration = end - start;
std::cout << "duration: " << duration.count() << " ns" << std::endl;
我已经循环运行了数千次,并且在我的特定 3.40GHz 桌面上始终获得 40 ns +/- 2 ns。
但是,当我查看我能睡的最短时间是多少时:
#include <thread>
hrc::time_point start = hrc::now();
std::this_thread::sleep_for( std::chrono::nanoseconds(1) );
hrc::time_point end = hrc::now();
std::chrono::nanoseconds duration = end - start;
std::cout << "slept for: " << duration.count() << " ns" << std::endl;
这表明我平均 sleep 时间为 55400 纳秒,即 55.4 微秒。比我预期的时间长得多。
将上述代码放入 for()
循环中,我尝试 sleep 不同的量,结果如下:
我有一些问题:
最佳答案
What could explain these numbers?
有一个非常明显的模式,您的所有结果始终比您请求的 sleep 时间长 54000ns。如果你看看 GCC 的 this_thread::sleep_for()
在 GNU/Linux 上是如何实现的,你会发现它只使用 nanospleep
并且正如 Cubbi 的评论所说,调用该函数可以大约需要50000ns。我猜想其中一些成本是进行系统调用,因此从用户空间切换到内核并返回。
Why does sleeping for a negative amount of time return 200+ ns, while sleeping for 0+ nanoseconds results in 50,000+ nanoseconds?
据我猜测,C 库会检查负数并且不会进行系统调用。
Is negative numbers as a sleep time a documented/supported feature, or did I accidentally stumble across some strange bug I cannot rely upon?
标准并不禁止传递负参数,因此是允许的,并且函数应该“立即”返回,因为相对超时指定的时间已经过去了。不过,您不能依赖负参数比非负参数返回得更快,这是您的特定实现的人为因素。
Is there a better C++ sleep call which would give me more consistent/predictable sleep times?
我不这么认为 - 如果我知道的话,我们就会在 GCC 中使用它来实现 this_thread::sleep_for()
。
编辑:在 GCC 的 libstdc++ 的最新版本中,我添加了:
if (__rtime <= __rtime.zero())
return;
因此,当请求零或负持续时间时,不会有系统调用。
关于c++11 - std::this_thread::sleep_for() 和纳秒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18071664/
根据这个问题:Fractional power of units of measures in F# F# 中的度量单位不支持分数幂。 在我的应用程序中,有时考虑带有度量前缀的数据是有益的,例如当处理
我是一名优秀的程序员,十分优秀!