यहां सरल सी ++ कोड है जो कॉलम प्रमुख के साथ 2 डी सरणी पंक्ति प्रमुख की तुलना करने की तुलना करता है।कॉलम प्रमुख की तुलना में 2 डी सरणी पंक्ति तेज तेज क्यों है?
#include <iostream>
#include <ctime>
using namespace std;
const int d = 10000;
int** A = new int* [d];
int main(int argc, const char * argv[]) {
for(int i = 0; i < d; ++i)
A[i] = new int [d];
clock_t ColMajor = clock();
for(int b = 0; b < d; ++b)
for(int a = 0; a < d; ++a)
A[a][b]++;
double col = static_cast<double>(clock() - ColMajor)/CLOCKS_PER_SEC;
clock_t RowMajor = clock();
for(int a = 0; a < d; ++a)
for(int b = 0; b < d; ++b)
A[a][b]++;
double row = static_cast<double>(clock() - RowMajor)/CLOCKS_PER_SEC;
cout << "Row Major : " << row;
cout << "\nColumn Major : " << col;
return 0;
}
घ के विभिन्न मूल्यों के लिए परिणाम:
घ = 10^3:
पंक्ति मेजर: 0,002431
कॉलम मेजर: 0,017186
d = 10^4:
पंक्ति मेजर: 0,237995
कॉलम मेजर: 2,04471
d = 10^5
पंक्ति मेजर: 53.9561
कॉलम मेजर: 444.339
अब सवाल यह है कि पंक्ति प्रमुख कॉलम प्रमुख से तेज क्यों है?
क्योंकि सी सरणी में ** पंक्ति प्रमुख ** और ** कैश ** ** के स्थानिक इलाके ** की वजह से है। – bolov
संभावित डुप्लिकेट [कैश इलाके सरणी प्रदर्शन के लिए क्यों मायने रखता है?] (Http://stackoverflow.com/questions/12065774/why-does-cache-locality-matter-for-array-performance) – bolov
इस बार यह नहीं है शाखा भविष्यवाणी :)। दोनों संस्करणों में आपके पास समान संख्या की तुलना होती है, और दोनों बार 'सत्य'/'झूठा' पैटर्न समान होता है (यानी कई 'सत्य' स्थितियां और फिर 'झूठी' एक - जब सूचकांक अंत तक पहुंच जाता है) – bolov