On 16/12/2015 14:00, Artella Coding wrote:
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);

Correct. You're defining the functions at the top level so there's no problem. The problem with the old, curried, form was the temptation to write:
   call3 (getSymbol mylib "setIntArray") (cPointer,cInt,cInt) cVoid
       (pData2,0,c_getIntArray(pData2,size-1))
inside the loop.

It's even more of a problem with passing functions because the old mechanism of passing the ML function as an argument resulted in the creation of a LibFFI closure for the argument each time the C function was called.

David
_______________________________________________
polyml mailing list
[email protected]
http://lists.inf.ed.ac.uk/mailman/listinfo/polyml

Reply via email to