- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
所以准确的计时对我来说很重要,我正在研究 C++ 11 中指定的 3 种时钟,即 system_clock
、steady_clock
和 high_resolution_clock
。我最初关心的是测试不同类型时钟的调用开销是否存在差异,并检查每种时钟的分辨率。这是我的示例程序:
#include <chrono>
#include <cstdio>
using namespace std;
using namespace std::chrono;
int main(int argc, char **argv)
{
size_t N = 1e6;
if(2 == argc) {
sscanf(argv[1], "%zu", &N);
}
#if defined(hrc)
typedef high_resolution_clock clock;
#warning "High resolution clock"
#elif defined(sc)
typedef steady_clock clock;
#warning "Steady clock"
#elif defined(sys)
typedef system_clock clock;
#warning "System clock"
#endif
const double resolution = double(clock::period::num) / double(clock::period::den);
printf("clock::period: %lf us.\n", resolution*1e6);
printf("clock::is_steady: %s\n", clock::is_steady ? "yes" : "no");
printf("Calling clock::now() %zu times...\n", N);
// first, warm up
for(size_t i=0; i<100; ++i) {
time_point<clock> t = clock::now();
}
// loop N times
time_point<clock> start = clock::now();
for(size_t i=0; i<N; ++i) {
time_point<clock> t = clock::now();
}
time_point<clock> end = clock::now();
// display duration
duration<double> time_span = duration_cast<duration<double>>(end-start);
const double sec = time_span.count();
const double ns_it = sec*1e9/N;
printf("That took %lf seconds. That's %lf ns/iteration.\n", sec, ns_it);
return 0;
}
我用它编译
$ g++-4.7 -std=c++11 -Dhrc chrono.cpp -o hrc_chrono
chrono.cpp:15:2: warning: #warning "High resolution clock" [-Wcpp]
$ g++-4.7 -std=c++11 -Dsys chrono.cpp -o sys_chrono
chrono.cpp:15:2: warning: #warning "System clock" [-Wcpp]
$ g++-4.7 -std=c++11 -Dsc chrono.cpp -o sc_chrono
chrono.cpp:15:2: warning: #warning "Steady clock" [-Wcpp]
我用 G++ 4.7.2 编译,然后运行
首先令人惊讶的是,这 3 种时钟显然是同义词。它们都有相同的周期(1 微秒),时间/调用几乎相同。 如果都一样,指定3种时钟有什么意义?这仅仅是因为chrono
的G++实现还不成熟吗?或者也许 3.1.10 内核只有一个用户可访问的时钟?
第二个惊喜是 steady_clock::is_steady == false。我相当确定,根据定义,该属性应该为真。是什么赋予了??我该如何解决(即实现稳定的时钟)?
如果您可以在其他平台/编译器上运行这个简单的程序,我很想知道结果。如果有人想知道,我的 Core i7 大约是 25 纳秒/迭代,而 Tegra 2 是 1000 纳秒/迭代。
最佳答案
steady_clock
支持 GCC 4.7(如 4.7 版本的文档所示:http://gcc.gnu.org/onlinedocs/gcc-4.7.2/libstdc++/manual/manual/status.html#status.iso.2011)和 steady_clock::is_steady
是正确的,但前提是您使用 --enable-libstdcxx-time=rt
参见 https://stackoverflow.com/a/12961816/981959有关该配置选项的详细信息。
对于 GCC 4.9,如果您的 OS 和 C 库支持 clock_gettime
的 POSIX 单调时钟,它将自动启用(这对于具有 glibc 2.17 或更高版本的 GNU/Linux 以及 Solaris 10、IIRC 是正确的)
这是在 AMD Phenom II X4 905e,2.5GHz 上使用 --enable-libstdcxx-time=rt
配置 GCC 4.8 的结果,但我认为它现在被限制到 800MHz,运行 Linux 3.6.11、glibc 2.15
$ ./hrc
clock::period: 0.001000 us.
clock::is_steady: no
Calling clock::now() 1000000 times...
That took 0.069646 seconds. That's 69.645928 ns/iteration.
$ ./sys
clock::period: 0.001000 us.
clock::is_steady: no
Calling clock::now() 1000000 times...
That took 0.062535 seconds. That's 62.534986 ns/iteration.
$ ./sc
clock::period: 0.001000 us.
clock::is_steady: yes
Calling clock::now() 1000000 times...
That took 0.065684 seconds. That's 65.683730 ns/iteration.
并且在运行 Linux 3.4.0、glibc 的 ARMv7 Exynos5 上使用 GCC 4.7 没有 --enable-libstdcxx-time
(因此所有三种时钟类型的结果相同) 2.16
clock::period: 1.000000 us.
clock::is_steady: no
Calling clock::now() 1000000 times...
That took 1.089904 seconds. That's 1089.904000 ns/iteration.
关于C++11 时钟:g++ steady_clock::is_steady == false?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15032462/
有没有什么优雅的方法可以将 boost chrono time_point 转换为标准库中的等价物? 最佳答案 恐怕你不能保证转换,除非你先验地接受 boost::chrono::steady_clo
std::chrono::steady_clock 的单调属性是否跨线程保留?例如,假设我有以下程序。 #include #include #include using namespace st
在尝试在 SFML 中制定可靠的游戏循环的过程中,我遇到了这个我似乎无法弄清楚的问题。我能够去除所有 SFML 代码,但仍然在 time.h 中看到 clock() 的问题。然后我走得更远,仍然看到使
当我想生成几个线程以在设定的时间内进行一些计算时,我遇到了一个问题。但是经过的总时间总是大于每个线程分配时间的总和,而我预计它会超过最大值。我在这里不明白什么? 一些示例代码: #include #
chrono::steady_clock 由4种成员类型组成:rep , period , duration , 和 timepoint . chrono::steady_clock::duratio
我的应用服务器代码中有一行代码使用 steady_clock 获取时间戳值,如下所示: uint64_t now = duration_cast(steady_clock::now().time_si
使用 boost::chrono::steady_clock 或 std::chrono::steady_clock 可以保证物理时间始终是单调的并且不受日期时间的影响系统的变化。这是我的问题,如果我
首先,让我说一下,我昨天才开始使用这个库,所以我对它的理解还很基础。我正在 try catch 我正在创建的视觉处理程序的 FPS,并使用 chrono 库将其输出到屏幕。在我的例子中,我需要将启动
我有一个标题时间为 std::chrono::steady_clock 的文件范围。 不同的服务器会将它们写入磁盘。 在使用文件的过程中,我会比较它们以找到最新的时间。 我对 https://en.c
基本上: auto p1 = std::steady_clock::now().time_since_epoch().count(); ... // do smth for unspecified p
考虑这段代码: #include #include using namespace std::chrono_literals; int main() { auto sx = std::ch
我有以下代码: #include struct SteadyTime : std::chrono::steady_clock::time_point { using time_point::
我正在尝试将 C++ 代码转换为 Python。什么是 python 等价物,我可以用来替代 std::chrono::steady_clock::now(); 它给出了 linux 上当前时间的准确
我需要保存一个boost::chrono::steady_clock::time_point类型的变量到文件中,然后从文件中检索它。时间格式并不重要,我希望将其保存为双倍。这可能吗? 最佳答案 您可以
这与 my previous question 有关我问 std::chrono::steady_clock::now 是否应该是 noexcept。现在我知道了,我应该想知道这个函数是如何报告错误的
我正在使用 steady_clock 来保存一些消息的时间戳。出于调试目的,拥有日历(或类似的东西)很有用。 对于其他时钟,有静态函数 to_time_t,但在 GCC (MinGW 4.8.0) 上
我能做到: double period_in_seconds = 3.4; auto as_duration = std::chrono::duration_cast(std::chrono::dur
我正在尝试获取自处理器启动以来的微秒时间, 我看过很多发since epoch的帖子,但是我需要since power-up的时间 此外,我正在尝试将时间设为 long int,而不是 time_po
如何从 boost::chrono::steady_clock::now() 获得 double 值?我不相信为此有一个 .count() 参数。 为什么我需要这个?我有一个无法解析 boost 返回
所以准确的计时对我来说很重要,我正在研究 C++ 11 中指定的 3 种时钟,即 system_clock、steady_clock 和 high_resolution_clock。我最初关心的是测试
我是一名优秀的程序员,十分优秀!