From my understanding, foreign function interface always has an overhead of
each call. This is true for all languages.

On Mon, Aug 24, 2020, 10:19 AM Kevin Li <[email protected]> wrote:

> Hi all,
>
> I have a C function that computes a curvature, but for our purposes it's
> simply a function whose C signature:
>
> double f(double x);
>
> I compiled this to a *.so (I am on Linux) and I could successfully call the
> shared library via cd.  However, there seems to be a
> non-negligible overhead in calling through the DLL, when I call f over an
> array. Specifically, I have:
>
> f =: 'path.to.library.so f > d d'&cd"0
>
> So I could do, e.g.
> f i:10
>
> Alternatively, I could define another function in the C file:
>
> void f_list(double *x, long len) {
>     for (long i = 0; i < len; i++) x[i] = f[i];
> }
>
> and expose this in the *.so.  Then I could define another verb
>
> fs =: 'path.to.library.so f_list > n *d x&cd
>
> and call that instead. I find that fs is usually 2-3 times faster than f,
> presumably because of the overhead in calling into the shared library.
> However, fs has two disadvantages:
>
> 1. It modifies the array in place, which makes my code less functional
> 2. It makes it harder to work with atoms (I have to convert an atom into a
> 1 dimensional array first).
>
> Is there a way to get the best of both worlds?
>
> Thanks!
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
>
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to