У меня очень странная проблема с производительностью, связанная с доступом к памяти.
Фрагмент кода:
#include <vector>
using namespace std;
vector<int> arrx(M,-1);
vector< vector<int> > arr(N,arrx);
...
for(i=0;i<N;i++){
for(j=0;j<M;j++){
//>>>>>>>>>>>> Part 1 <<<<<<<<<<<<<<
// Simple arithmetic operations
int n1 = 1 + 2; // does not matter what (actually more complicated)
// Integer assignment, without access to array
int n2 = n1;
//>>>>>>>>>>>> Part 2 <<<<<<<<<<<<<<
// This turns out to be most expensive part
arr[i][j] = n1;
}
}
N и M - некоторые константы порядка 1000 - 10000 или около того.
Когда я компилирую этот код (выпускная версия), для его завершения требуется около 15 часов, если комментируется часть 2. С этой частью время выполнения увеличивается до 100+ часов, поэтому почти в 10 раз медленнее. Я ожидал, что операция присваивания будет намного дешевле, чем даже простые арифметические операции. Это действительно так, если мы не используем массивы. Но с этим массивом назначение кажется намного дороже.
Я также попробовал 1-D массив вместо 2-D - тот же результат (для 2D, очевидно, медленнее).
Я также использовал int ** или int * вместо vector > или vector - опять результат тот же.
Почему у меня такая низкая производительность при назначении массива и я могу это исправить?
Edit:
Еще одно наблюдение: во второй части данного кода, если мы изменим присвоение с
arr[i][j] = n1; // 172 clocks
до
n1 = arr[i][j]; // 16 clocks
скорость (цифры в комментариях) повышается. Еще интереснее, если мы изменим строку:
arr[i][j] = n1; // 172 clocks
до
arr[i][j] = arr[i][j] * arr[i][j]; // 110 clocks
скорость также выше, чем для простого задания
Есть ли разница в чтении и записи из / в память? Почему я получаю такое странное представление?
Заранее спасибо!