Thursday, 17 May 2018

c++ 2d array access speed changes based on [a][b] order?











I have been tinkering around with a program that I'm using to simply sum the elements of a 2d array. A typo led to what seem to me at least, some very strange results.



When dealing with array, matrix[SIZE][SIZE]:



for(int row = 0; row < SIZE; ++row)
for(int col = 0; col < SIZE; ++col)
sum1 += matrix[row][col];



Runs very quickly, however is the above line sum1... is modified:



sum2 += matrix[col][row]


As I did once on accident without realizing it, I notice that my runtime increases SIGNIFICANTLY. Why is this?


Answer



This is due to caching behaviour of your program.




Arrays are just consecutive blocks of memory, so when you access [row][column] you are accessing the memory sequentially. This means the data page you are accessing is on the same page, so the access is much faster.



When you do [column][row], you aren't accessing that memory sequentially anymore, so you will end up with more cache misses, so your program runs much slower.


No comments:

Post a Comment

casting - Why wasn&#39;t Tobey Maguire in The Amazing Spider-Man? - Movies &amp; TV

In the Spider-Man franchise, Tobey Maguire is an outstanding performer as a Spider-Man and also reprised his role in the sequels Spider-Man...