Блог переехал. Актуальная версия поста находится по адресу: http://aakinshin.net/ru/blog/dotnet/arrays-access-performance/.
В первой части статьи я задался задачей сравнить производительность многомерных массивов. Рассматривались данные в виде двумерного массива N*M, тестировалась скорость доступа к элементу [i,j]
при итерировании по всему массиву двумя циклами. Для сравнения было выбрано три варианта: одномерный массив single[i * N + j]
и двумерные массивы jagged[i][j]
, rectangular[i, j]
. Изначально у меня получилось, что jagged
-версия работает быстрее single
версии, но более детальное изучение проблемы показало, что дело может измениться в зависимости от используемых JIT-оптимизаций. Разберёмся с проблемой более подробно.
Рассмотрим методы из бенчмарка с наборами параметров «100»
(N=M=100, IterationCount=100000) и «101»
(N=M=101, IterationCount=100001) под x86 и x64. На моей машине (Intel Core i7-3632QM CPU 2.20GHz) получились следующие результаты:
100-x86 Single : 1012ms Jagged : 772ms Rectangular : 1460ms 101-x86 Single : 1036ms Jagged : 785ms Rectangular : 1485ms 100-x64 Single : 544ms Jagged : 346ms Rectangular : 741ms 101-x64 Single : 785ms Jagged : 793ms Rectangular : 1050ms