全部: 我有兩段代碼。第一個是:爲什麼這個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 –