Я переключаю программу с использования MVector Word32
на STUArray Word Word32
. В моем векторном коде я использовал unsafeMove
для перемещения векторных фрагментов; думая, что это, вероятно, упаковка memmove
для эффективности.
case dst ⊕ 3 of
src | n < src + w -> do
let w0 = n - src
let w' = w - w0
unsafeMove (slice dst w0 v) (slice src w0 v)
if w' <= 3
then do
unsafeMove (slice (n - 3) w' v) (slice 0 w' v)
else do
let w'' = w' - 3
unsafeMove (slice (n - 3) 3 v) (slice 0 3 v)
unsafeMove (slice 0 w'' v) (slice 3 w'' v)
src | n < dst + w -> do
let w1 = n - dst
let w'' = w - w1
unsafeMove (slice dst w1 v) (slice src w1 v)
unsafeMove (slice 0 w'' v) (slice 3 w'' v)
src -> do
unsafeMove (slice dst w v) (slice src w v)
Класс типов MArray
, похоже, не предоставляет способ перемещения нескольких элементов за один вызов, а только один за другим. Есть ли оболочка для одновременного перемещения нескольких элементов STUArray
(или, может быть, ByteArray#
)?
думая, что это, вероятно, обертка memmove для эффективности
Сначала я решил проверить для вас, так ли это на самом деле, и так ли это.
unsafeMove
в конечном итоге сводится к операции basicUnsafeCopy
, определенной для MVector, которая делегирует copyMutableArray
.copyMutableArray#
.memmove
и memcopy
, в зависимости от того, перекрываются ли массивы.Я перерыл источник Data.Array и не нашел ссылок на copyMutableArray
. Другая возможность заключается в том, что Data.Array предоставляет вам некоторый способ просмотра вашего STUArray как MutableArray и, таким образом, вызова copyMutableArray
себя. Но я также не нашел упоминания о MutableArray в Data.Array.
Мой предварительный вывод заключается в том, что в Data.Array нет обертки memmove
/memcopy
.
@dfeuer ага, я как-то пропустил Data.Vector.Unboxed
@rampion, vector
очень большой. Я (пока) не нашел там модулей, которые позволили бы вам отказаться от потенциально дорогостоящего оборудования для нарезки, когда оно вам не нужно. И механизм слияния в смешанном режиме настолько сложен, что почти никто не может понять, что происходит под капотом или что им нужно сделать, чтобы убедиться, что их код скомпилирован так, как задумано.
Нет ничего необычного в том, чтобы копаться в
Data.Array.Base
или дажеGHC.Arr
, чтобы получить доступ, необходимый для выполнения достаточно эффективных операций с массивами. Если вам действительно не нужна гибкая индексация, используйте вместо этого массивы вprimitive
или, возможно,vector
.