【翻译】Getting an accurate execution time in C++ (micro seconds)

Getting an accurate execution time in C++ (micro seconds)

问题

I want to get an accurate execution time in micro seconds of my program implemented with C++. I have tried to get the execution time with clock_t but it’s not accurate.

我想用c++实现我的程序的精确执行时间,以微秒为单位。我已经尝试用clock_t获得执行时间,但它不准确。

我想得到我用C++实现的程序运行的时间(微妙级别),我尝试用clock_t得到运行的时间但是他不是精确的。

(Note that micro-benchmarking is hard. An accurate timer is only a small part of what’s necessary to get meaningful results for short timed regions. See Idiomatic way of performance evaluation? for some more general caveats)

(注意,微基准测试很难。准确的计时器只是在短时间内获得有意义结果的一小部分。参见绩效评估的惯用方法?一些更一般的警告)

注意到微基准测试很难。必要地,一个精确的计时器仅仅是短时间内获取有意义的结果的一小部分。参参见 性能评估的惯用方式 得到更多一般的警示

评论大意

  • 为什么你觉得clock_t不准确

  • 考虑到执行时间与CPU(上的电荷),内存可用性,缓存和所有可能的IO,线程调度等等,你真的确定你需要这种水平的精确度?

  • 我需要微妙级别的运行时间,的但是clock_t提供的是毫秒级别的运行时间…

回答

If you are using c++11 or later you could use std::chrono::high_resolution_clock.

如果您使用的是c++11或更高版本,您可以使用std::chrono::high_resolution_clock。

如果你使用的是C++11或者之后的版本,你可以使用std::chrono::high_resolution_clock

A simple use case :(一个简单的用例)

auto start = std::chrono::high_resolution_clock::now();
...
auto elapsed = std::chrono::high_resolution_clock::now() - start;

long long microseconds = std::chrono::duration_cast<std::chrono::microseconds>(
        elapsed).count();

This solution has the advantage of being portable.

这个解决方案具有可移植性的优点。

这个解决方案有可移植性的优点

Beware that micro-benchmarking is hard. It’s very easy to measure the wrong thing (like your benchmark optimizing away), or to include page-faults in your timed region, or fail to account for CPU frequency idle vs. turbo.

注意,微基准测试是困难的。很容易测量错误的东西(比如您的基准优化),或在您的时间区域包括页面错误,或无法考虑CPU频率空闲与turbo。

注意微基准测试是难的。很容易测出错误的东西(比如你的基准优化),或者在你的时间内包含页面错误,或者没有考虑CPU频率和涡轮 (大意就是微基准测试很难,与天时地利有关,可能CPU温度高一点都会影响[doge])

See ==Idiomatic way== of performance evaluation? for some general tips, e.g. sanity check by testing the other one first and see if that changes which one appears faster.

参见绩效评估的惯用方法?关于一些一般的技巧,例如,通过先测试另一个来检查完整性,看看哪个出现得更快。

参见性能评估的常用方法,关于一些一般的技巧,例如先通过测试另一个技巧看看是否这个改变出现的更快。

评论大意

  • 从gcc 4.8.1开始纳秒可使用了

  • 以微妙为单位测试程序应该忽略setup和destruction

  • 事实上不同的操作系统设置的时间不同。那就是为什么你测量的不是应用程序的性能,而是系统的性能,如果算上这一部分的话,为什么你要这么做呢?除非你是一个系统的开发者,你不能做任何与系统设置时间相关的事情。即使在一个操作系统上,硬盘可能需要旋转为了读取可执行文件。你真的想以微秒级别去测量他吗?

  • emmm,举个例子,我想要做这个(测量微秒级别)因为我是一个游戏开发者,并且我想要知道在win8上我的游戏启动花费了多久。作为一个开发者,我对可执行文件的大小有影响,我能在二进制部分嵌入资源…(balabala一堆)等等,所以我认为需要测量什么必须澄清。

  • 对的,那是一个应用程序。但是你真的会做仅仅是通过测量时间吗?你真正需要一个分析器来确定那一部分造成了高设置的时间,任何项目的启动都应该是瞬间的,恕我直言你真的不需要测量这个.

猜你喜欢

转载自blog.csdn.net/m0_53005929/article/details/124852761