Hi, so if my interpretation of the above is correct the timings shouldn't
be changing (i.e. one shouldn't be expecting the timings to improve)? The
benchmarks seem to indicate this. I modified the second benchmark in
http://lists.inf.ed.ac.uk/pipermail/polyml/2015-October/001673.html [the
one with "(* This uses new FFI *)" at the top] to the following, and the
time to compute was roughly the same :
***************************************************************************
***************************************************************************
open Foreign;
val mylib = loadLibrary "./intArray.so";
val c1 = buildCall1((getSymbol mylib "createIntArray"),cInt,cPointer)
val c2 = buildCall1((getSymbol mylib "destroyIntArray"),cPointer,cVoid)
val c3 = buildCall3((getSymbol mylib
"setIntArray"),(cPointer,cInt,cInt),cVoid)
val c4 = buildCall2((getSymbol mylib "getIntArray"),(cPointer,cInt),cInt)
val c5 = buildCall1((getSymbol mylib "getSumIntArray"),(cPointer),cInt)
fun c_createIntArray (size) = c1 (size);
fun c_destroyIntArray (p) = c2 (p);
fun c_setIntArray (p,elem,value) = c3 (p,elem,value);
fun c_getIntArray (p,elem) = c4 (p,elem);
fun c_getSumIntArray (p) = c5 (p);
val size:int = 50000;
val loops:int = 30;
val cap:int = 50000;
fun loop (pData2) =
let
fun loopI i =
if i = size then
let val _ = () in
c_setIntArray(pData2,0,c_getIntArray(pData2,size-1));
()
end
else
let
val previous = c_getIntArray(pData2,i-1);
val use = if previous > cap then 0 else previous in
c_setIntArray(pData2,i,use+1);
loopI (i+1)
end
in loopI 1 end
fun benchmarkRun (pData2) =
let
fun bench i =
if i = loops then ()
else let val _ = () in
loop (pData2);
bench (i+1)
end
in bench 1 end
fun main () =
let
val pData = c_createIntArray(size);
in
benchmarkRun(pData);
print (Int.toString (c_getSumIntArray (pData)));
print "\n"
end
***************************************************************************
***************************************************************************
Thanks
On Wed, Dec 16, 2015 at 6:05 PM, David Matthews <
[email protected]> wrote:
> There have been a few changes to the Foreign structure. The callN
> functions have been renamed as buildCallN and the way functions are passed
> as arguments has been changed.
>
> The reason for the changes is to make clear that the expensive operations
> are creating the C functions and closures and that calling a C function or
> passing a constructed closure are comparatively cheap.
>
> It is important to call the buildXXX functions at the top-level e.g. in a
> structure, so that the C function is created once. The old callN functions
> were curried and it wasn't apparent that the partial application to the
> conversions was quite different to the application of this to the
> arguments. For that reason the buildXXX take a tuple.
>
> David
>
> _______________________________________________
> polyml mailing list
> [email protected]
> http://lists.inf.ed.ac.uk/mailman/listinfo/polyml
>
_______________________________________________
polyml mailing list
[email protected]
http://lists.inf.ed.ac.uk/mailman/listinfo/polyml