全部: 我有两段代码。第一个是:为什么这个C++代码不是更快?
#include <iostream>
using namespace std;
static constexpr long long n = 1000000000;
int main() {
int sum = 0;
int* a = new int[n];
int* b = new int[n];
for (long long i=0; i<n; i++) {
a[i] = static_cast<int>(i);
}
for (long long i=0; i<n; i++) {
sum *= a[i];
sum += a[i];
}
for (long long i=0; i<n; i++) {
b[i] = static_cast<int>(i);
}
for (long long i=0; i<n; i++) {
sum *= b[i];
sum += b[i];
}
cout<<sum<<endl;
}
第二个是:
#include <iostream>
using namespace std;
constexpr long long n = 1000000000;
int main() {
int* a = new int[n];
int* b = new int[n];
int sum = 0;
for (long long i=0; i<n; i++) {
a[i] = static_cast<int>(i);
b[i] = static_cast<int>(i);
}
for (long long i=0; i<n; i++) {
sum *= a[i];
sum += a[i];
sum *= b[i];
sum += b[i];
}
cout<<sum<<endl;
}
我认为第一方案应比第二快的多,因为它更多的缓存友好。然而,事实是第二个是更快的垃圾。在我的服务器上,第一个需要23秒,而第二个需要20秒,有人可以解释这一点吗?
不过,它看起来像运行1000000000循环两次而不是四次更快。我想知道为什么。如果我错了,用铁铲打我,但我认为这是不言自明的。 – Steeve
由于您正在生成大量的整数溢出,无论如何,您的程序完全未定义行为。 –
没有足够的信息。你使用什么编译器标志?什么是所有的静态铸造?尽管如此,这可能是目前最高的C++问题的克隆:http://stackoverflow.com/questions/11227809/why-is-it-faster-to-process-a-sorted-array-than-an-unsorted -array –