有效地将字符串复制到映射位置

Efficiently copying string to mmap'ed location

我想尽可能高效地将字符串从 OCaml 程序复制到 mmap 内存区域(通过 Genarray.file_map 获得)。我的 objective 是允许其他进程在 OCaml 进程 运行 时从这个共享内存中读取,开销最小(我不需要完整的并发功能,只有一个写入器和一个 reader).

我尝试按字符复制字符,如以下代码片段所示(我在其中复制字符串 s 的前 255 个字符):

let fd = Unix.openfile "/tmp/foo" [Unix.O_RDWR; Unix.O_CREAT] 0o600 in
let mmap = Bigarray.Genarray.map_file fd Bigarray.Char Bigarray.C_layout true
    (Array.of_list [256])
in
let n = min (String.length s - 1) 255 in
for i = 0 to n do
  Bigarray.Genarray.set mmap [|i|] (String.get s i)
done;
Bigarray.Genarray.set mmap [|n|] (Char.chr 0)

但这非常低效:即使输入相对较小,执行时间也比没有 mmap 时长 3 倍。

有更好的方法吗?理想情况下,我想避免太多的依赖,例如简街 core.

Bigarray 模块只提供blit bigarrays 之间。如果额外的开销确实是由于映射内存的行为造成的,您可以尝试先从字符串复制到双数组,然后从双数组 blit 到映射目标。 (要从映射数组中读取,您可以执行相反的操作。)

我唯一能想到的另一件事是用 C 编写传输代码(使用 memcpy())并将它们称为外部函数。