On Fri, Oct 06, 2006 at 06:46:20AM -0700, Jerry Hedden wrote: > Rick Delaney snidely replied: > > I can see no reason why anyone would believe these numbers > > without seeing the tests. > > Gawd, I love being called a liar first thing in the morning. > It really gets my blood pumping. > > First, let's see just how slow generating a 'default' object > string is. (I'm going to call this a CTA string because it's > composed of the Class name, the Type and the Address).
> Results: > Rate str tid > str 56.5/s -- -83% > tid 340/s 502% -- The results are completely counterintuitive. I too expected that the builtin C code for generating threads=SCALAR(0x1817fa0) would be faster than going through the overloading code in Perl_call_amagic, and then that kicking off a nested call to another routine (which happens to be XS) What's actually happening is that because threads objects already have some overloading, then for this stringification of a reference, Perl_call_amagic gets called *anyway*. Here's the good bit though: SV *msg; if (off==-1) off=method; msg = sv_2mortal(Perl_newSVpvf(aTHX_ "Operation \"%s\": no method found,%sargument %s%s%s%s", AMG_id2name(method + assignshift), (flags & AMGf_unary ? " " : "\n\tleft "), SvAMAGIC(left)? "in overloaded package ": "has no overloaded magic", SvAMAGIC(left)? HvNAME_get(SvSTASH(SvRV(left))): "", SvAMAGIC(right)? ",\n\tright argument in overloaded package ": (flags & AMGf_unary ? "" : ",\n\tright argument has no overloaded magic"), SvAMAGIC(right)? HvNAME_get(SvSTASH(SvRV(right))): "")); if (amtp && amtp->fallback >= AMGfallYES) { DEBUG_o( Perl_deb(aTHX_ "%s", SvPVX_const(msg)) ); } else { Perl_croak(aTHX_ "%"SVf, (void*)msg); } return NULL; We make a message. Only it's never getting used. But we went to all the effort. It will be a SMOP this evening to get rid of creating that message needlessly. Which might change the benchmark results. Unless anyone wishes to beat me to it. Nicholas Clark