Paul writes: > > --- Brian Ingerson <[EMAIL PROTECTED]> wrote: > > Garrett Goebel wrote: > > > > > > From: Paul [mailto:[EMAIL PROTECTED]] > > > > > > > > Anybody know offhand *why* my() lexicals are supposedly faster? > > .... > > > Yes this is OT, but I'll contribute to the problem as well... > > > > My coworker Gisle Aas (maybe you've heard of him ;) says that globals > > and lexicals have identical speed because Perl optimizes out the > > symbol-table lookup. > > > > Trust Gisle. > > lol -- now *there's* an answer. > So for my details I should go to the parse tree docs, and the code, I'm > thinking. > > BTW -- with many thanks to everyone -- my question was "why are they > faster", but the reason was never the speed -- it was to understand the > way Perl stores and *accesses* lexicals. > > Any input? =o) If you have a reasonably recent Perl, you can do the following: % perl -MO=Terse,exec -e '$f = 123' OP (0x8180688) enter COP (0x8180628) nextstate SVOP (0x8175298) const IV (0x80f8770) 123 SVOP (0x817b488) gvsv GV (0x81017b0) *f BINOP (0x8180600) sassign LISTOP (0x8180660) leave % perl -MO=Terse,exec -e 'my $f = 123' OP (0x81805d0) enter COP (0x8180598) nextstate SVOP (0x8104b88) const IV (0x8104c9c) 123 OP (0x817b490) padsv [1] BINOP (0x81761f0) sassign LISTOP (0x81752a0) leave As you can see from the output, for a non-lexical $f, Perl uses an opcode "gvsv GV *f". The gvsv instruction gets a pointer to the entire glob (*f) from which it dereferences the SV (scalar) part and pushes it on the stack. See pp_hot.c: PP(pp_gvsv) { djSP; EXTEND(SP,1); if (PL_op->op_private & OPpLVAL_INTRO) PUSHs(save_scalar(cGVOP_gv)); else PUSHs(GvSV(cGVOP_gv)); RETURN; } For the lexical, Perl has already determined at compile time that $f is in pad slot number 1 (think stack or register allocation). padsv is: PP(pp_padsv) { djSP; dTARGET; XPUSHs(TARG); ... If you navigate all the macros, you'll find that takes curpad (a pointer to an array of SV pointers: the current "stack frame" where "stack" is in the sense of a traditional compiler, not the (main) Perl stack) and pushes curpad[1] (remember $f was allocated slot 1 at compile time) onto the (main Perl) stack. --Malcolm -- Malcolm Beattie <[EMAIL PROTECTED]> Unix Systems Programmer Oxford University Computing Services ______________________________________________________________________ Apache Interface to OpenSSL (mod_ssl) www.modssl.org User Support Mailing List [EMAIL PROTECTED] Automated List Manager [EMAIL PROTECTED]
