Какой самый быстрый? boost::multi_array
или std::vector
?
У меня будут (не постоянные) 17.179.869 элементы, хранящиеся в 3 измерениях, к которым нужно будет обращаться внутри for
Цикл очень быстро и очень часто. Что будет наиболее эффективным? std::vector
или boost::multi_array
?
(Я не ожидаю, что это будет сделано в течение секунды, но я бы хотел, чтобы это было как можно более эффективным, потому что разница в наносекунды может сэкономить много времени.)
Лучший совет — оценить его самостоятельно.
В любом случае, поскольку у вас постоянный размер, есть и другие решения:
int data[X][Y][Z]
)X*W*H + Y*W + Z
, может быть полезен в некоторых ситуацияхstd::array
, который в основном представляет собой массив C ++ с некоторым синктактическим сахаром, взятым из коллекций STLstd::vector
Я думаю, это первое решение, которое можно попробоватьboost::multi_array
, который предназначен для поддержки N размерных массивов, так что он может быть излишним для вашей цели, но, вероятно, имеет лучшую локализацию данных по сравнению с вектором.Эти векторные классы библиотеки разработаны так, чтобы быть простыми в использовании и относительно безопасными.
Они настолько быстры, насколько могут быть в их дизайне, но ничто не сравнится с выполнением этого самостоятельно (за исключением, возможно, сборки вручную).
Для размера, о котором вы говорите (2e10 элементов), я бы больше интересовался эффективностью, чем удобством для пользователя.
Если ваш внутренний цикл выполняет очень мало вычислений для каждого элемента, вы обнаружите, что вычисления индексации являются доминирующими,
который предлагает сделать некоторую раскрутку и переход по указателю.
(Может быть Вы можете рассчитывать на то, что компилятор развернет его, но меня это не волнует.)
Единственный способ узнать наверняка — попробовать оба варианта и профилировать код. Однако, как куча идей, это то, что я думаю, вы найдете.
В конце дня попробуйте и посмотрите