in reply to Re: Return array or list from an XSUB?
in thread Return array or list from an XSUB?

So in short, returning an array ref is easier to code and can be significantly more efficient if you're returning a lot of values

Been playing around with some stuff, trying to verify the above quote.

I came up with this (perhaps it's sophistic):
use warnings; use Benchmark; use Inline C => Config => BUILD_NOISY => 1; use Inline C => <<'EOC'; void foo(AV * x) { dXSARGS; SV ** elem; int len, i; len = av_len(x) + 1; sp = mark; for(i = 0; i < len; i++) { elem = av_fetch(x, i, 0); XPUSHs(*elem); } PUTBACK; XSRETURN(len); } AV * bar(AV * x) { dXSARGS; SV ** elem; int len, i; sp = mark; len = av_len(x) + 1; for(i = 0; i < len; i++) { elem = av_fetch(x, i, 0); XPUSHs(*elem); } return x; } EOC $len = 2000000; @x = (); for(1 .. $len) {push @x, $_} timethese (1, { 'ref' => '$ret = bar(\@x)', 'list' => '@ret = foo(\@x)', });
For me that produces:
Benchmark: timing 1 iterations of list, ref... list: 1 wallclock secs ( 0.36 usr + 0.11 sys = 0.47 CPU) @ 2 +.13/s (n=1 ) (warning: too few iterations for a reliable count) ref: 0 wallclock secs ( 0.11 usr + 0.00 sys = 0.11 CPU) @ 9 +.17/s (n=1 ) (warning: too few iterations for a reliable count)
The difference is certainly *measurable*, but I wonder if it's all that *significant* (given the size of the array). I also wonder a little about the assertion that it's easier to return an AV* than a list. For most of the stuff that I have done, I've found it easier to return a list - even though the coding may involve additional keystrokes. (Admittedly, most of the stuff I've done is Inline based ... and I'm a simpleton :-)

Cheers,
Rob

Replies are listed 'Best First'.
Re^3: Return array or list from an XSUB?
by chromatic (Archbishop) on Nov 14, 2007 at 16:55 UTC
    The difference is certainly *measurable*....

    Not really. That's what "too few iterations" means. It's barely even significant either, as the difference between those two pieces of code is the addition of two stack-manipulating macros in the former case. You're doing about the same amount of work in both, so my guess is that there's another factor in your benchmark that more testing would expose.