<div dir="ltr">Отвечая на свой же вопрос - потому что join и concat предварительно делают что-то наподобие my$z=" "x((length$x)+(length$y)); Т.к. такое выражение выравнивает substr к показателям join и concat. Кстати, еще вопрос, где у Перла функция конкатенации (та, что символ-точка)? В CORE::* не нашел. Мне нужен кодереф от нее.</div><div class="gmail_extra"><br><div class="gmail_quote">2015-03-10 17:03 GMT+03:00 Andrey Kovbovich <span dir="ltr"><<a href="mailto:akovbovich@gmail.com" target="_blank">akovbovich@gmail.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>Кто-нибудь знает, за счет чего substr быстрее?</div><div><br></div><div>$ perl -MBenchmark=cmpthese -wE'my$x="0"x1_000_000;my$b="1"x100_000;cmpthese(10000,{concat=>sub{my$z=$x.$b;},substr=>sub{my$z="";substr$z,(length$z),(length$x),$x;substr$z,(length$z),(length$b),$b;},join=>sub{my$z=join("",$x,$b)}});'</div><div>         Rate   join concat substr</div><div>join   3922/s     --    -0%   -58%</div><div>concat 3937/s     0%     --   -57%</div><div>substr 9259/s   136%   135%     --</div><div><br></div></div>
</blockquote></div><br></div>