Потому что substr не копирует строку, он только в SV указатель на строку 
меняет. Это фишка конкретно сабстера. По этому его скорость работы не зависит 
от размеров строки и смещения в ней.
join и конкат создает новую строку (очевидно)


Вторник, 10 марта 2015, 17:21 +03:00 от Andrey Kovbovich <[email protected]>:
>Отвечая на свой же вопрос - потому что join и concat предварительно делают 
>что-то наподобие my$z=" "x((length$x)+(length$y)); Т.к. такое выражение 
>выравнивает substr к показателям join и concat. Кстати, еще вопрос, где у 
>Перла функция конкатенации (та, что символ-точка)? В CORE::* не нашел. Мне 
>нужен кодереф от нее.
>
>2015-03-10 17:03 GMT+03:00 Andrey Kovbovich  < [email protected] > :
>>Кто-нибудь знает, за счет чего substr быстрее?
>>
>>$ 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)}});'
>>         Rate   join concat substr
>>join   3922/s     --    -0%   -58%
>>concat 3937/s     0%     --   -57%
>>substr 9259/s   136%   135%     --
>>
>
>-- 
>Moscow.pm mailing list
>[email protected] |  http://moscow.pm.org

-- 
Moscow.pm mailing list
[email protected] | http://moscow.pm.org

Ответить