我想尽可能高效地将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
。
答案 0 :(得分:1)
Bigarray模块仅在bigarray之间提供blit
。如果额外的开销确实是由于mmapped内存的行为,你可能首先尝试从字符串复制到bigarray,然后从bigarray blit到mmapped目标。 (要从mmapped数组中读取,可以执行相反的操作。)
我能想到的另一件事就是用C代码编写传输(使用memcpy()
)并将它们称为外部函数。