После проведения некоторых экспериментов на квадратных матрицах разного размера возникла картина. Неизменно переносит матрицу размера 2^n
медленнее, чем перенос одного из размеров 2^n+1
. При малых значениях n
разница не является значительной.
Большие различия происходят, однако, в значении 512. (по крайней мере для меня)
Отказ от ответственности: я знаю, что функция фактически не переносит матрицу из-за двойной замены элементов, но она не имеет значения.
Выполняет код:
#define SAMPLES 1000
#define MATSIZE 512
#include <time.h>
#include <iostream>
int mat[MATSIZE][MATSIZE];
void transpose()
{
for ( int i = 0 ; i < MATSIZE ; i++ )
for ( int j = 0 ; j < MATSIZE ; j++ )
{
int aux = mat[i][j];
mat[i][j] = mat[j][i];
mat[j][i] = aux;
}
}
int main()
{
//initialize matrix
for ( int i = 0 ; i < MATSIZE ; i++ )
for ( int j = 0 ; j < MATSIZE ; j++ )
mat[i][j] = i+j;
int t = clock();
for ( int i = 0 ; i < SAMPLES ; i++ )
transpose();
int elapsed = clock() - t;
std::cout << "Average for a matrix of " << MATSIZE << ": " << elapsed / SAMPLES;
}
Изменение MATSIZE
позволяет нам изменять размер (duh!). Я отправил две версии на ideone:
- размер 512 - средний 2,46 мс - http://ideone.com/1PV7m
- размер 513 - средний 0,75 мс - http://ideone.com/NShpo
В моей среде (MSVS 2010, полная оптимизация) разница аналогична:
- размер 512 - средний 2,19 мс
- размер 513 - средний 0,57 мс
Почему это происходит?