Потому что 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
