Да, это правда.По моему опыту, вы можете примерно вдвое снизить производительность, обходя матрицу неправильно.
Причина в том, что большая часть вашего оборудования построена на множестве предположений о том, как оно будет вероятно использовать, а затем они используют эти знания для достижения лучшей производительности.В этом случае соответствующим принципом является «Пространственная локальность», концепция, которая «если вам недавно был нужен адрес N, то вам, вероятно, скоро понадобится содержимое адреса N + 1».
Ваша RAM предназначенапо этой причине передавать память в пакетном режиме.Когда вы запрашиваете одно слово данных, он начинает загружать больший непрерывный кусок памяти, так что он готов к тому моменту, когда вы , вероятно, попросите об этом мгновение спустя.
И сам процессорделает то же самое.Его кеш устроен по тому же принципу.Он хранит целые строки кэша (обычно 16 или 32 байта, если память служит) вместо отдельных байтов или слов.Таким образом, когда вы запрашиваете один байт, вся строка кэша считывается в кэш, так что соседние данные также доступны, если вам это нужно.
Если вы пересекаете матрицу столбец за столбцом, то каждый доступ к памятинаходится по адресу, который находится далеко от предыдущего, таким образом, нет никакой пространственной локализации, и поэтому и кэш ЦП, и ваша ОЗУ не могут предсказать, какие данные им следует предварительно выбрать, и в итоге вы ожидаете передачи данных вамвремя.