- RU.PERL ----------------------------------------------------------- RU.PERL - Msg : #3044 [502] От : Alexander P. Russkih 2:468/75 25 марта 04, 07:55 Кому : All 26 марта 04, 23:26 Тема : Re: Убрать пробелы в хеше ------------------------------------------------------------------------------- @RFC-NNTP-Posting-Date: Thu, 25 Mar 2004 05:55:09 +0000 (UTC) From: "Alexander P. Russkih"Reply-To: rs_alex@bigfoot.com Sergey Zhuravlev wrote: > Слышал я, что умные книжки не всем помогают... ок. только давай учтем одну маленькую особенность. вызовем тест бенчмарка для всех трех вариантов не в одном коде, а посредством трех последовательных вызовов, ну, знаешь, чтобы там всякие кеширования и оптимизации роаля не играли, логично? тогда смотрим ниже: > rbcmaint-2.04$ perl -MBenchmark -e ' > $_="sdgfdsfgsdfg"; > timethese(1000000, > {one => sub {s/^\s+|\s+$//g}, > ones => sub {s/^\s*(.*)\s*$/$1/}, > two => sub {s/^\s+//; s/\s+$//;} > } ); > ' > Benchmark: timing 1000000 iterations of one, ones, two... > one: 0 wallclock secs ( 0.50 usr + 0.00 sys = 0.50 CPU) @ > 2000000.00/s (n=1000000) > ones: 17 wallclock secs (11.77 usr + -0.02 sys = 11.76 CPU) @ > 85049.83/s (n=1000000) > two: 1 wallclock secs ( 0.76 usr + 0.00 sys = 0.76 CPU) @ > 1319587.63/s (n=1000000) все вызывалось в той же последовательности, что и в твоем примере: olden@home:~$ perl -MBenchmark -e '$_="sdgfdsfgsdfg";timethese(1000000, {one => sub {s/^\s+|\s+$//g}} );' Benchmark: timing 1000000 iterations of one... one: 1 wallclock secs ( 0.39 usr + 0.00 sys = 0.39 CPU) @ 2564102.56/s (n=1000000) (warning: too few iterations for a reliable count) olden@home:~$ perl -MBenchmark -e '$_="sdgfdsfgsdfg";timethese(1000000, {one => sub {s/^\s*(.*)\s*$/$1/}} );' Benchmark: timing 1000000 iterations of one... one: 6 wallclock secs ( 6.27 usr + 0.00 sys = 6.27 CPU) @ 159489.63/s (n=1000000) olden@home:~$ perl -MBenchmark -e '$_="sdgfdsfgsdfg";timethese(1000000, {one => sub {s/^\s+//; s/\s+$//}} );' Benchmark: timing 1000000 iterations of one... one: 0 wallclock secs ( 0.48 usr + 0.00 sys = 0.48 CPU) @ 2083333.33/s (n=1000000) кстати говоря запуск твего теста выдал несколько более другие результаты, но это не суть важно, так как пропорционально они практически соответствуют твоим: olden@home:~$ perl -MBenchmark -e ' > $_="sdgfdsfgsdfg"; > timethese(1000000, > {one => sub {s/^\s+|\s+$//g}, > ones => sub {s/^\s*(.*)\s*$/$1/}, > two => sub {s/^\s+//; s/\s+$//;} > } ); > ' Benchmark: timing 1000000 iterations of one, ones, two... one: 1 wallclock secs ( 0.30 usr + 0.00 sys = 0.30 CPU) @ 3333333.33/s (n=1000000) (warning: too few iterations for a reliable count) ones: 6 wallclock secs ( 5.94 usr + 0.00 sys = 5.94 CPU) @ 168350.17/s (n=1000000) two: 1 wallclock secs ( 0.44 usr + 0.00 sys = 0.44 CPU) @ 2272727.27/s (n=1000000) наверное у нас просто разные конфигурации компьютеров. кстати говоря мне бы хотелось взглянуть на результаты тестов в том виде в котором привел их я, чтобы делать окончательный вывод. а так мы получаем то, что и следовало доказать: на текущий момент самая быстрая и оптимальная для всех конструкция - это последовательный вызов s/^\s+// и s/\s+$//. :-) --- Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.5) Gecko/20031007 * Origin: Registered Linux User #341226 (2:468/75@fidonet)