Jeremy White wrote:
Jeremy White wrote:
Just done some performance testing with this type map:
if(SvROK($arg)) {
SV** out=hv_fetch((HV*)SvRV($arg), \"-handle\", 7, 0);
if(out != NULL)
$var = ($type) SvIV(*out);
else
$var = NULL;
} else
$var = ($type) SvIV($arg);
Benchmark: timing 1000000 iterations of NewTypeMap, OldTypeMap...
NewTypeMap: 29 wallclock secs (29.64 usr + 0.06 sys = 29.70 CPU) @
33666.63/s (
n=1000000)
OldTypeMap: 38 wallclock secs (38.22 usr + 0.02 sys = 38.23 CPU) @
26154.05/s (
n=1000000)
I'm no typemap expert, but don't see anything wrong with that.
Indeed, only doing the hv_fetch once seems like an obvious
improvement. If you can hold onto the code until after the next
release, then we can get it into CVS for the following release?
No problem - there may be one issue. This code was compiled via Mingw,
and as I'm declaring SV** out within a block of code, VC will complain.
This may have been the reason that two hash reads were needed. I've a
copy of VC now, so once the current build is out of the way, I'll do
more testing.
I'm no C expert either, but I think it was always OK (C89 spec) to
declare variables at the start of a block. (I think it was the C99 spec
that allowed you to declare a variable anywhere). I think if it
compiles with your somewhat old version of MinGW we'll be OK with VC98.
We'll try it once the next release is out of the way.
Regards,
Rob.