【发布时间】:2015-09-10 09:48:36
【问题描述】:
我有 3 个独立的全局函数,我想测试它的速度。我正在使用此代码:
// case 1
{
chrono::duration<double, milli> totalTime;
for (uint32_t i{ 0 }; i < REPEATS; ++i)
{
auto start = chrono::steady_clock::now();
func1(); // "normal" c++ code
auto end = chrono::steady_clock::now();
auto diff = end - start;
cout << chrono::duration <double, milli>(diff).count() << " ms" << endl;
}
}
// case 2
{
chrono::duration<double, milli> totalTime;
for (uint32_t i{ 0 }; i < REPEATS; ++i)
{
auto start = chrono::steady_clock::now();
func2(); // multithreaded c++ code
auto end = chrono::steady_clock::now();
auto diff = end - start;
cout << chrono::duration <double, milli>(diff).count() << " ms" << endl;
}
}
// case 3
{
chrono::duration<double, milli> totalTime;
for (uint32_t i{ 0 }; i < REPEATS; ++i)
{
auto start = chrono::steady_clock::now();
func3(); // SIMD c++ code
auto end = chrono::steady_clock::now();
auto diff = end - start;
cout << chrono::duration <double, milli>(diff).count() << " ms" << endl;
}
}
这个func1()、func2()、func3()是不会改变程序状态的全局函数(我没有任何全局变量)。
输出结果取决于运行案例。如果我运行 case 1 和 case 2 我分别有 100ms 和 10ms。如果我运行 case 1 和 case 3 我有 100ms 和 130ms。如果我运行案例 1、2、3 我有 130ms、10ms、 120 毫秒。第一个案例在 30% 时变慢,第三个案例变得更快!如果我单独运行案例,我有 100ms、10ms、130ms。我试图关闭优化 - 代码变得(惊喜,惊喜)慢得多,但至少结果是相同的,不取决于案例顺序。所以我得出一个结论,编译器做了一些特别的事情。是真的吗?
我使用的是 Win7 和 VS 2013。
【问题讨论】:
-
为什么不提供我们调用的函数? :o 如果不知道函数,谁会知道编译器可以进行哪些优化?
-
如果第一次调用需要从内存或磁盘加载公共数据,然后为连续调用缓存或缓冲,则顺序很重要。
-
“所以我得出一个结论,编译器做了一些特别的事情。是真的吗?” 是的,他们这样做了!没有您提供的更多信息,这就是我能提供的所有信息。
-
缓存未命中也很重要。我建议您通过多次循环这些方法并计算每个函数需要多少的平均值来预热缓存。单一衡量指标与任何绩效报告都不相关。
-
@dau_sama 如果您仔细观察,您会发现我在循环中使用了
REPEAT。
标签: c++ performance optimization