gpt4 book ai didi

c++ - 比较算法的执行时间 : why does the order of execution matter?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:46:59 25 4
gpt4 key购买 nike

每当我尝试比较两个竞争算法(使用 C++)的执行时间时,我都会使用 std::chrono 作为以前在这个问题中建议的示例:Measuring execution time of a function in C++

但是,我总是注意到被比较算法的执行顺序对执行时间有显着影响。它甚至经常改变哪些竞争算法被认为是最快的。例如,假设我有两个算法 algo1algo2

我的意思是下面的代码:

std::chrono::high_resolution_clock::time_point start0, start1;
std::chrono::high_resolution_clock::time_point end0, end1;

start1 = std::chrono::high_resolution_clock::now();
algo1();
end1 = std::chrono::high_resolution_clock::now();

start2 = std::chrono::high_resolution_clock::now();
algo2();
end2 = std::chrono::high_resolution_clock::now();

auto time_elapsed1 = std::chrono::duration_cast<std::chrono::nanoseconds>(end1 - start1).count();
auto time_elapsed2 = std::chrono::duration_cast<std::chrono::nanoseconds>(end2 - start2).count();

给出与以下代码不同的结果:

std::chrono::high_resolution_clock::time_point start0, start1;
std::chrono::high_resolution_clock::time_point end0, end1;

start2 = std::chrono::high_resolution_clock::now();
algo2();
end2 = std::chrono::high_resolution_clock::now();

start1 = std::chrono::high_resolution_clock::now();
algo1();
end1 = std::chrono::high_resolution_clock::now();

auto time_elapsed1 = std::chrono::duration_cast<std::chrono::nanoseconds>(end1 - start1).count();
auto time_elapsed2 = std::chrono::duration_cast<std::chrono::nanoseconds>(end2 - start2).count();

对于我可能想要比较的几乎所有算法 1 和 2。

所以,我的问题有两个方面:1) 为什么会这样,即为什么顺序很重要? 2) 是否有更好的方法来比较两种算法的执行时间,即应该如何进行才能更好、更准确地进行比较?

PS:当然,我总是在所有编译器优化的情况下进行测试。

最佳答案

这很可能是由于缓存。

可以通过多次运行SAME算法轻松验证缓存的效果。您可能会注意到第一次执行所花费的时间比后续执行花费的时间要长得多。

当我不得不为我的博士论文比较两种算法时,我最终连续执行每种算法 10 次,丢弃第一个结果,然后对剩余的 9 个结果进行平均,这 9 个结果非常一致。

被丢弃的第一个结果是否重要是有争议的,但对我来说并不重要,因为我更感兴趣的是比较两种算法的相对性能(因此正在寻找每个算法的一致运行时间算法),而不是测量缓存的影响或每种算法在不同情况下的绝对性能。

关于c++ - 比较算法的执行时间 : why does the order of execution matter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38961439/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com