我写了下面的代码
#define TimeCode(Code) \
{\
clock_t t1 = clock();\
Code \
clock_t t2 = clock();\
double elapsed = (t2 - t1) * 1.0 / CLOCKS_PER_SEC;\
std::cout << "Elapsed time " << elapsed << " sec" << std::endl; \
}
void loop(int nz)
{
for (int i = 0; i < 5400; i++)
{
for (int j = 0; j < 5400; j++)
for (int k = 0; k < nz; k++)
;
}
}
int main(int argc, char* argv[])
{
TimeCode(loop(17);)
TimeCode(loop(34);)
TimeCode(loop(649);)
return 0;
}
我用
g++ -o main main.cpp
编译了它。结果是Elapsed time 0.85579 sec
Elapsed time 3.14095 sec
Elapsed time 53.7562 sec
那么,经过的时间怎么不与循环大小成正比呢?
最佳答案
由于您的循环结构,它不能严格成比例:对于loop(n)
,您执行:
i的一次初始化,i的5400增量和比较
j的5400初始化,j的5400 * 5400增量和比较
k的5400 * 5400初始化,k的5400 * 5400 * n增量和比较
那是29 165 401个固定的初始化,29 165 400个固定的增量和比较以及29 160 000 * n个迭代和比较。因此,您无法获得比例计时。
如果要使比例更合适,则应使k
循环为外部循环:
void loop(int nz)
{
for (int k = 0; k < nz; k++)
for (int i = 0; i < 5400; i++)
for (int j = 0; j < 5400; j++)
;
}
我建议您切换到chrono high resolution clock:
#define TimeCode(Code, n) \
{\
high_resolution_clock::time_point t1 = high_resolution_clock::now();\
Code (n);\
high_resolution_clock::time_point t2 = high_resolution_clock::now();\
double elapsed = duration_cast<milliseconds>(t2 - t1).count();\
std::cout << "Elapsed time " << elapsed << " ms -> " << elapsed/n << std::endl; \
}
有了这两个更改,在所有这三种情况下,我的PC上每次迭代都可获得72到73 ms。
在这三个结果之间测得的微小差异小于时钟分辨率不确定性(在Windows平台上为+/- 15 ms)。考虑到这一点(但不确定性取决于平台),我将宏中的输出行更改为:
std::cout << "Elapsed time " << elapsed << " ms -> " << elapsed/n << " inaccuracy:" <<(elapsed-15)/n<<" - "<<(elapsed+15)/n<<std::endl; \
这里是最终结果: