모두 : 두 개의 코드가 있습니다. 첫 번째는 다음과 같습니다왜이 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 –