Задача простая и типичная. Есть большой двумерный массив. И нам хочется наиболее эффективно с ним работать. В моем случае, меня интересовал массив чисел (байт).
Что ж… Самое простое, что приходит на ум — это воспользоваться стандартным двумерным массивом типа и обращаться к элементам на манер a[x][y]. Но насколько это эффективно? Возможно, будет быстрее оперировать с одномерным массивом и обращаться к элементам как a[x + y*size_x]?
Чтобы расставить все точки над i, я написал тест, который проверяет скорость чтения и записи различных вариантов массивов.
На ум пришли следующие варианты:
Итак, я написал небольшой тест для сравнения скорости выполнения кода. В тесте производилась имитация чтения и записи всех элементов массива 1500х1500 точек. Каждая операция выполнялась 5 раз и бралось среднее время.
Также, естественно, динамические массивы были заранее созданы и наполнены элементами (т.е. новые элементы не добавлялись во время тестовых замеров).
Итак, что получилось:
Диаграмма:
Выводы очевидны.
Исходный код выложил сюда: wonderfl.net/c/d58d
Что ж… Самое простое, что приходит на ум — это воспользоваться стандартным двумерным массивом типа и обращаться к элементам на манер a[x][y]. Но насколько это эффективно? Возможно, будет быстрее оперировать с одномерным массивом и обращаться к элементам как a[x + y*size_x]?
Чтобы расставить все точки над i, я написал тест, который проверяет скорость чтения и записи различных вариантов массивов.
На ум пришли следующие варианты:
- 2-мерный нетипизированный массив (Array)
- 1-мерный нетипизированный массив (Array)
- 2-мерный типизированный массив (Vector.<Vector.<int>>)
- 1-мерный типизированный массив (Vector.<int>)
- Использование BitmapData как хранилища и setPixel/getPixel для доступа
- 1-мерный массив байт (ByteArray)
- Ну, и наконец, изврат. Обращение к ByteArray, ускоренное средствами быстрого доступа к памяти технологии Alchemy
Итак, я написал небольшой тест для сравнения скорости выполнения кода. В тесте производилась имитация чтения и записи всех элементов массива 1500х1500 точек. Каждая операция выполнялась 5 раз и бралось среднее время.
Также, естественно, динамические массивы были заранее созданы и наполнены элементами (т.е. новые элементы не добавлялись во время тестовых замеров).
Итак, что получилось:
Диаграмма:
Выводы очевидны.
Исходный код выложил сюда: wonderfl.net/c/d58d