对于我的博士学位我正在用c ++编写DEM(离散元素方法)模拟,描述计算密集型的粒子流。我有很多不同的算法来计算不同的参数。每个算法的运行时间可以根据点的配置(点数保持不变)而显着变化。对于测试,使用不同的配置和点数进行了大量的单元测试。
对于优化和性能测试,在假设单元测试框架所需的时间不变的情况下,多次运行特定单元测试似乎最容易,我可以将不同的算法性能相互比较。所以在伪代码中我想这样做,其中algorithm1和algorithm2是单个算法的不同实现,不同的unitTests是不同的输入配置:
//Preformance test algorithm1
timer = 0;
startTimer();
for(n = 1000) {
unitTest1(algorithm1);
unitTest2(algorithm1);
.....
}
print(timer);
//Performance test algorithm2
timer = 0;
startTimer();
for(n = 1000) {
unitTest1(algorithm2);
unitTest2(algorithm2);
.....
}
print(timer);
问题:这是进行性能测试的有效方法,可以产生可靠且可比较的结果,还是单元测试框架能够以某种方式使我的结果无效?在为并行处理编写代码时,也可以将此方法扩展为测试性能。
附加信息:我使用的单元框架是Boost测试库,由于运行时间长,我无法通过不同的配置对整个代码进行有效的性能测试。
答案 0 :(得分:3)
首先,此任务不需要Boost;有很多方法可以用标准C ++做到这一点,我在Time measurements中有一些方法,其中std::crhono
似乎可以解决问题。
DEM需要多个点作为输入,因此我会在不同的输入上运行算法,然后执行平均执行时间。
对于其他算法我会做同样的事情,但是在另一个程序中,因为你不知道操作系统在做什么。此外,您希望两种算法都对缓存进行冷启动,并且在某些情况下,在同一程序中执行这两种算法可能会给第二种算法带来轻微的优势。
所以我会做这样的事情:
#include <iostream>
#include <ctime>
#include <ratio>
#include <chrono>
#define UTN 10 // Unit tests number
int main ()
{
// populate `unitTest` vector
...
using namespace std::chrono;
high_resolution_clock::time_point t1 = high_resolution_clock::now();
for(int i = 0; i < UTN; ++i
unitTest[i](algorithm1);
high_resolution_clock::time_point t2 = high_resolution_clock::now();
duration<double> time_span = duration_cast<duration<double>>(t2 - t1);
std::cout << "It took me " << time_span.count()/UTN << " seconds.";
std::cout << std::endl;
return 0;
}
现在我写下了报告的时间,然后又重新执行了上述程序,但现在algorithm2()
已经到位,测量它所花费的平均时间并进行比较。