有效地将字符串复制到mmap的位置

时间:2017-03-12 01:06:06

标签: ocaml mmap

我想尽可能高效地将OCaml程序中的字符串复制到<!DOCTYPE html> <html> <body> <canvas id="myCanvas" width="200" height="100" style="border:1px solid #d3d3d3;"> Your browser does not support the HTML5 canvas tag.</canvas> <div id="buttons"> <input type="button" id="clear" value="Clear"> <input type="button" onClick="erase()" value="Erase"> </div> <script> var canvas = document.getElementById("myCanvas"); var ctx = canvas.getContext("2d"); function getMousePos(canvas, evt) { var rect = canvas.getBoundingClientRect(); return { x: evt.clientX - rect.left, y: evt.clientY - rect.top }; } canvas.addEventListener('mousemove', function(evt){ var mousePos = getMousePos(canvas, evt); ctx.clearRect(0, 0, canvas.width, canvas.height); ctx.strokeStyle = 'red'; ctx.lineTo(mousePos.x,mousePos.y); ctx.stroke(); } ); document.getElementById('clear').addEventListener('click', function(){ ctx.clearRect(0, 0, canvas.width, canvas.height); }, false); function erase(){ ctx.clearRect(0, 0, canvas.width, canvas.height); } </script> </body> </html> 'ed内存区域(通过mmap获得)。我的目标是允许其他进程在OCaml进程运行时从这个共享内存中读取,只需要很少的开销(我不需要完整的并发功能,只有一个编写器和一个读取器)。

我尝试复制每个字符的字符,如下面的代码段(我复制字符串Genarray.file_map的前255个字符):

s

但效率非常低:即使输入相对较小,执行时间也比没有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) 要长3倍。

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

1 个答案:

答案 0 :(得分:1)

Bigarray模块仅在bigarray之间提供blit。如果额外的开销确实是由于mmapped内存的行为,你可能首先尝试从字符串复制到bigarray,然后从bigarray blit到mmapped目标。 (要从mmapped数组中读取,可以执行相反的操作。)

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