假设我编写了一个程序,然后我为代码做了一些“优化”。
在我的例子中,我想测试C ++ 11中新功能std::move
可以提高程序性能的程度。
我想检查“优化”是否有意义。
目前我通过以下步骤测试它:
std::move
),编译,获取二进制文件m1 std::move
),编译,获取二进制文件m2 使用命令“time”来比较耗时:
time ./m1 ; time ./m2
编辑:
为了获得统计结果,需要进行数千次测试。
有没有更好的方法可以做到这一点,还是有一些工具可以帮助它?
答案 0 :(得分:1)
通常使用简单的时间比较来测量性能,例如endTime-beginTime
总是一个好的开始,粗略估计。
稍后您可以使用 profiler ,例如 Valgrind 来衡量程序的不同部分的执行情况。
通过分析,您可以测量程序的空间(内存)或时间复杂度,特定指令的使用或函数调用的频率/持续时间。
如果您想使用GUI进行更高级的分析功能,还有AMD CodeAnalyst。它是免费/开源的。
答案 1 :(得分:0)
有几种工具(包括其他工具)可以为您进行分析:
其中一些需要特定的编译方式或特定的编译器。其中一些人特别擅长分析给定的处理器架构(AMD / Intel ......)。
由于您似乎可以访问C ++ 11,并且如果您只想测量某些时间,可以使用std::chrono
。
#include <chrono>
#include <iostream>
class high_resolution_timer
{
private:
typedef std::chrono::high_resolution_clock clock;
clock::time_point m_time_point;
public:
high_resolution_timer (void)
: m_time_point(clock::now()) { }
void restart (void)
{
m_time_point = clock::now();
}
template<class Duration>
Duration stopover (void)
{
return std::chrono::duration_cast<Duration>
(clock::now()-m_time_point);
}
};
int main (void)
{
using std::chrono::microseconds;
high_resolution_timer timer;
// do stuff here
microseconds first_result = timer.stopover<microseconds>();
timer.restart();
// do other stuff here
microseconds second_result = timer.stopover<microseconds>();
std::cout << "First took " << first_result.count() << " x 10^-6;";
std::cout << " second took " << second_result.count() << " x 10^-6.";
std::cout << std::endl;
}
但是你应该意识到优化几毫秒的整体运行时几乎没有任何意义(如果你的程序运行时间> = 1s)。您应该在代码中计算高度重复的事件(如果有的话,或者至少是那些瓶颈)。如果这些显着改善(这可能是毫秒或微秒),您的整体表现也可能会提高。