【发布时间】:2015-05-06 16:09:25
【问题描述】:
我找到了这个话题Why is it faster to process a sorted array than an unsorted array?。并尝试运行此代码。我发现奇怪的行为。如果我使用-O3 优化标志编译此代码,则需要2.98605 sec 才能运行。如果我用-O2 编译它需要1.98093 sec。我尝试在同一环境中的同一台机器上多次运行此代码(5 或 6 次),我关闭了所有其他软件(chrome、skype 等)。
gcc --version
gcc (Ubuntu 4.9.2-0ubuntu1~14.04) 4.9.2
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
那么请您向我解释一下为什么会发生这种情况?我阅读了gcc 手册,发现-O3 包括-O2。谢谢你的帮助。
P.S.添加代码
#include <algorithm>
#include <ctime>
#include <iostream>
int main()
{
// Generate data
const unsigned arraySize = 32768;
int data[arraySize];
for (unsigned c = 0; c < arraySize; ++c)
data[c] = std::rand() % 256;
// !!! With this, the next loop runs faster
std::sort(data, data + arraySize);
// Test
clock_t start = clock();
long long sum = 0;
for (unsigned i = 0; i < 100000; ++i)
{
// Primary loop
for (unsigned c = 0; c < arraySize; ++c)
{
if (data[c] >= 128)
sum += data[c];
}
}
double elapsedTime = static_cast<double>(clock() - start) / CLOCKS_PER_SEC;
std::cout << elapsedTime << std::endl;
std::cout << "sum = " << sum << std::endl;
}
【问题讨论】:
-
每个程序都运行一次吗?你应该多试几次。还要确保 nothing else 在您用于基准测试的机器上运行,
-
@BasileStarynkevitch 我添加了代码。我试了几次,结果都一样。我尝试使用
-mtune=native进行编译 - 结果与以前相同(没有此标志)。处理器 - Intel Core i5 -2400 -
我只是做了一点实验,并在
O2中添加了O3一次执行一项的额外优化。 O3 为我添加的其他优化标志是:-fgcse-after-reload -finline-functions -fipa-cp-clone -fpredictive-commoning -ftree-loop-distribute-patterns -ftree-vectorize -funswitch-loops。我发现将-ftree-vectorize作为优化标志添加到 O2 会产生负面影响。我在 Windows 7 上使用 mingw-gcc 4.7.2。 -
@doctorlove 我无法解释为什么循环的自动矢量化会变慢,所以我认为答案信息太少:)
-
将变量
sum从局部变量更改为全局变量或静态变量会使 O2 和 O3 之间的差异消失。该问题似乎与大量堆栈操作有关,如果它是本地的,则在循环内存储和检索变量sum。我的汇编知识太有限,无法完全理解 gcc 生成的代码:)
标签: c++ gcc optimization