On 21/09/2015 06:49, Artella Coding wrote:
Hi, thanks for the pointers on the ffi.

"I strongly suspect that SML functions like IntArray.update take less time
than the FFI overhead, so no improvement is possible by using C functions."

Yes it seems so. I was hoping that I could somehow achieve the extremely
low overheads that I get when using the haskell ffi (because I think ghc
haskell compiler also uses libffi ;
https://github.com/ghc/ghc/commit/39e206a7badd18792a7c8159cff732c63a9b19e7)
but it is not obvious how I can do that.

The foreign function interface is a very old design. The main documentation dates from 1994. I updated it to use libffi but didn't change the basic design. I would like to update it so that when a foreign function is defined libffi builds the interface once rather than on every call. It would probably be easier to start from scratch rather than adapt the current CInterface structure.

Even if it is rebuilt there will still be significant overheads calling through the FFI. It needs to switch between the ML and C calling conventions and leave its ML stack and the ML heap in a safe state if another thread causes a GC while a thread is in foreign code.

It seems that "val previous = IntArray.sub(data,i-1)" and
"IntArray.update(data,i,use+1);" are bottlenecks. For example the following
program :

It's most likely that the overhead has to do with bounds checking. Arrays and vectors in ML are defined to raise the Subscript exception if the index is out of range. A clever compiler could probably detect that checks are redundant in this case and optimise them away but Poly/ML doesn't do that. It's also more complex in Poly/ML because int is arbitrary precision.

I ran a check replacing IntArray.sub and IntArray.update with versions that don't do bounds checking and the time reduced from 48s to 27s. You may be able to get some of the benefits if you can recast your program to use some of the more complex functions in Array such as modifyi. These avoid bounds checking since they can only be applied to the whole array.

David

_______________________________________________
polyml mailing list
polyml@inf.ed.ac.uk
http://lists.inf.ed.ac.uk/mailman/listinfo/polyml

Reply via email to