<HTML><BODY>Потому что substr не копирует строку, он только в SV указатель на строку меняет. Это фишка конкретно сабстера. По этому его скорость работы не зависит от размеров строки и смещения в ней.<br>join и конкат создает новую строку (очевидно)<br><br><br>Вторник, 10 марта 2015, 17:21 +03:00 от Andrey Kovbovich <akovbovich@gmail.com>:<br>
<blockquote style="border-left:1px solid #0857A6; margin:10px; padding:0 0 0 10px;">
<div id="">
<div class="js-helper js-readmsg-msg">
<style type="text/css"></style>
<div>
<base target="_self" href="https://e.mail.ru/">
<div id="style_14259972970000000503_BODY"><div dir="ltr">Отвечая на свой же вопрос - потому что join и concat предварительно делают что-то наподобие my$z=" "x((length$x)+(length$y)); Т.к. такое выражение выравнивает substr к показателям join и concat. Кстати, еще вопрос, где у Перла функция конкатенации (та, что символ-точка)? В CORE::* не нашел. Мне нужен кодереф от нее.</div><div><br><div>2015-03-10 17:03 GMT+03:00 Andrey Kovbovich <span dir="ltr"><<a href="//e.mail.ru/compose/?mailto=mailto%3aakovbovich@gmail.com" target="_blank">akovbovich@gmail.com</a>></span>:<br><blockquote 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>
</div>
<div>-- <br>
Moscow.pm mailing list<br>
<a href="/compose?To=moscow%2dpm@pm.org">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org" target="_blank">http://moscow.pm.org</a><br>
</div>
<base target="_self" href="https://e.mail.ru/">
</div>
</div>
</div>
</blockquote>
<br></BODY></HTML>