Weird.

There shouldn't be any performance penalty to reading an OOK ("beheaded") scalar. Rather than adding an offset each time the string it accessed, the pointer to the string is changed to point beyond the "head" when the string is "beheaded".

use Devel::Peek qw( Dump ); my $s = "abcdef"; $s .= "g"; # Trigger COW Dump( $s ); substr( $s, 0, 1, "" ); Dump( $s );
SV = PV(0x59d752a54ee0) at 0x59d752a830d0 REFCNT = 1 FLAGS = (POK,pPOK) PV = 0x59d752a6b2e0 "abcdefg"\0 CUR = 7 LEN = 16 SV = PV(0x59d752a54ee0) at 0x59d752a830d0 REFCNT = 1 FLAGS = (POK,OOK,pPOK) OFFSET = 1 PV = 0x59d752a6b2e1 ( "\x01" . ) "bcdefg"\0 CUR = 6 LEN = 15

Before the beheading, the string started at 0x59d752a6b2e0 and used 7 bytes of 16.

After the beheading, the string started at 0x59d752a6b2e1 and used 6 bytes of 15.

In both cases, the same memory block starting at 0x59d752a6b2e0 is used. But because the PV, CUR and LEN fields were adjusted, reading from the scalar is identical whether it's an OOK ("beheaded") scalar or not.


In reply to Re: Are beheaded strings known to be slow? by ikegami
in thread Are beheaded strings known to be slow? by Anonymous Monk

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.