В большом количестве мест в программном обеспечении, которое я пишу, имеются трехмерные массивы short
или float
, обычно с несколькими миллионами элементов. Данные лучше всего понятны как трехмерный массив, поскольку он описывает значения в обычных местах в пространстве.CLR многоосевое перемещение массива
В другом месте я увидел упоминание о том, что .NET CLR не очень «совершенен», когда дело доходит до прохождения этих массивов, например, при вычислении новых значений и заполнении второго массива одинакового размера и размера. Если это так, почему это так?
Из соображений удобочитаемости я не осевшие на идее использования неровных массивов, но, но если это действительно ответ, то я готов, но:
Чтобы обойти эту проблему, что это было предложено мне что я отформатирую данные как один размерный массив. Например, если мой массив имеет размеры с величинами m
, n
и o
, тогда я бы создал float[m*n*o]
вместо float[m,n,o]
и написал свой собственный индексатор, чтобы добраться до правильного расположения массива во время обхода.
Специфический случай использования в распараллеливания обхода, например:
Parallel.For(0,m)((x) => for(y=0,y<n,y++) { for(z=0,z<o,z++) doSomething(array(x,y,z)); });
Где в одном индексированных случае был бы Parallel.ForEach(myArray, (position) => doSomething(array(Position)))
вида, что происходит вместо вложенных for
петель.
Итак, вопрос в том, действительно ли это будет быстрее, чем полагаться на встроенную индексацию массива CLR?
EDIT: Я предоставил свой собственный ответ ниже, основываясь на некоторых тестах времени. Код включен.
Вы бы профиль его, чтобы быть уверенным, но я бы поставил больше времени тратится на копирование данных, то поиск по индексу. –
Каков ваш источник для того, чтобы заявить, что копирование 3D-массива происходит медленно? – Servy
doSomething() лучше быть существенным методом, или шина памяти победит попытки использования потоковой передачи для ускорения кода. В этом случае индексирование массива перестает быть актуальным. У вас есть несколько лошадей, если вы хотите увидеть, какой из них быстрее, вы запустите их. –