我想找出在Linux上用C ++编写的函数的执行时间。我找到了很多相关的帖子。我尝试了此链接Timer Methods中提到的所有方法来计算时间。以下是我的函数执行时间的结果:
time() : 0 seconds
clock() : 0.01 seconds
gettimeofday() : 0.002869 seconds
rdtsc() : 0.00262336 seconds
clock_gettime() : 0.00672151 seconds
chrono : 0.002841 seconds
请帮助我在读数中哪种方法可靠,因为所有结果的读数都不同。我读到你的操作系统在不同的任务之间切换,因此读数不能非常准确。有没有办法可以计算CPU花在我的功能上的时间。我听说过使用性能分析工具,但还没有找到任何一个函数的例子。请指导我。
答案 0 :(得分:2)
阅读time(7)。
由于各种原因(并且取决于您的实际硬件,即您的主板),时间并不像您希望的那样准确。
因此,添加一些循环重复您的函数多次,或更改其输入以使其运行更长时间。确保整个程序的执行时间(由time(1) ...给出)至少约为一秒钟(如果可能,确保您至少有半秒的 CPU 时间)。
对于分析,编译并与g++ -Wall -pg -O1
链接,然后使用gprof(1)(有更复杂的方式进行分析,例如oprofile ...)。
另请参阅this answer与非常相似的question(同一Zara)。
答案 1 :(得分:2)
如果您正在进行简单的测试,试图找出哪个实现更好,那么任何方法都可以。例如:
const int MAX = 10000; // times to execute the function
void benchmark0() {
auto begin = std::chrono::steady_clock::now();
for (int i = 0; i < MAX; ++i)
method0();
auto now = std::chrono::steady_clock::now();
auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(now - begin);
std::cout << "Cost of method0() is " << elapsed .count() << " milliseconds" << std::endl;
}
void benchmark1() { /* almost the same as benchmark0, but calls method1 */ }
int main() {
benchmark0();
benchmark0();
benchmark1();
benchmark1();
}
您可能已经注意到benchmark0
和benchmark1
已被连续两次调用:因为会有CPU缓存,I / O ......,您可能想要摆脱性能增益/由于缓存而丢失,但衡量的是纯粹的执行时间。
当然,您也可以使用g ++来分析程序。