C++ Callgrind对代码性能有什么影响?

C++ Callgrind对代码性能有什么影响?,c++,c++11,profiling,callgrind,C++,C++11,Profiling,Callgrind,我使用Callgrind是为了查看特定函数被调用了多少次。然而,我也对执行时间感兴趣 我知道在Callgrind上运行程序需要更长的时间,因为它需要获取信息。然而,令我惊讶的是,时间是如何变化的。在我的例子中,我正在二维和三维网格上运行两种不同版本的快速行进法(FMM和简化FMM)。结果如下: 在2D中,FMM/SFMM的比率根本没有保持,但至少总是>1(FMM总是比SFMM需要更长的时间)。然而,在3D中,Callgrind的效果完全相反,时间完全改变了:SFMM将Callgrind执行的时

我使用Callgrind是为了查看特定函数被调用了多少次。然而,我也对执行时间感兴趣

我知道在Callgrind上运行程序需要更长的时间,因为它需要获取信息。然而,令我惊讶的是,时间是如何变化的。在我的例子中,我正在二维和三维网格上运行两种不同版本的快速行进法(FMM和简化FMM)。结果如下:

在2D中,FMM/SFMM的比率根本没有保持,但至少总是>1(FMM总是比SFMM需要更长的时间)。然而,在3D中,Callgrind的效果完全相反,时间完全改变了:SFMM将Callgrind执行的时间更短,但在常规执行中执行的时间更长

我使用的编译(-Ofast,-fno finite math only)一直都是相同的,相同的二进制文件在callgrind和常规运行中运行。/bin name

时间测量功能来自std::chrono

因此,问题是:由于我在所有情况下都使用相同的二进制文件,为什么相同的二进制文件的行为会如此不同?在这种情况下,我得到的其他数据(函数调用、%时间成本等)可靠吗?使用常规执行命令运行二进制文件时,预期会出现类似Callgrind的结果

编辑:在实现中,主要的变化是在FMM中我使用了Boost Fibonacci堆,在SFMM中我使用了一个带有Boost优先级队列的小修改

谢谢大家!

试试看。您不会注意到它引入的开销,也不会对执行时间造成太多干扰。