Date: Fri, 22 Nov 2002 04:22:02 +0500
From: Andrey Sapozhnikov <sapa@icb.chel.su>
Newsgroups: ftn.ru.perl
Subject: Анализ скорости выполнения Perl операторов и функций
>> Ведь grep тоже, насколько мне известно, возвращает список. И вообще,
>> если записать @arr = map{$words{$_}++}@words, то map работает как раз
>> в те самые полтора раза быстрее, чем без присваивания массиву, в то
>> время как grep в таком же случае начинает работать медленней (не
>> поверите!) приблизительно в те же полтора раза. Вот такие хитрые
>> сообщающиеся сосуды...
>
> Вот это уже интересно. Hе, базу пусть Андрей подводит... Он сырцы читал.
Прежде чем подводить базу я позволил себе еще раз провести бенчмарки.
Сорри за длинный постинг. Зато достаточно полный.
====================== test.pl =======================
#!/usr/bin/perl -w
use strict;
use Benchmark;
my @words = (qw(a b c a b c c d ftg g htg ftg tgtg gg h rg tg t t tg yg))
x 12000;
1. Сортировка существенного влияния на скорость не оказывает.
2. Самый быстрый оператор цикла - однострочный (постфиксный) foreach.
3. Традиционный foreach и grep ничего никуда не возвращающий
работают чуть медленнее, но примерно одинаково. Однако следите за тем,
чтоб и вправду ничего не возвращалось ибо будучи расположенным в
последней строке функции оператор неявно сработает как return grep ...
4. "void-context" ускоряет и grep и map. Причем grep ускоряется
много сильнее. Здесь сказывается то, что алгоритм работы grep
для скалярного контекста становится много проще. Исполнение выражения
и (если true) инкремент счетчика, а в map внутреннее выражение
продолжает исполняться в списковом контексте после чего полученный
"минисписок" уничтожается, а к счетчику добавляется его размер.
5. Использование блоков кода { code } вместо code очень немного, но
стабильно снижает производительность.
Кто еще наблюдает какие-либо странности в данном тесте и
имеет вопросы - задавайте.
From: Timur Vafin <tland@bip.ru>
V>> Кто может подсказать, почему map работает медленнее прямого перебора
V>> массива?
AC> Потому что он генерирует новый список. А то, что тебе результат не нужен,
AC> для него не аргумент.
Что то не пойму...
#!/usr/bin/perl -w
use Benchmark;
@junk = `cat /etc/motd`;
$count = 100_000;
timethese($count, {
'map' => sub { my @a = @junk;
map { s/a/b/ } @a;
},
'for' => sub { my @a = @junk;
foreach (@a) { s/a/b/ };
},
});
Результат:
Benchmark: timing 100000 iterations of for, map...
for: 0 wallclock secs ( 0.22 usr + 0.00 sys = 0.22 CPU) @
454545.45/s (n=100000)
(warning: too few iterations for a reliable count)
map: 0 wallclock secs ( 0.14 usr + -0.01 sys = 0.13 CPU) @
769230.77/s (n=100000)
(warning: too few iterations for a reliable count)
572 Прочтений • [Анализ скорости выполнения Perl операторов и функций (benchmark perl speed optimization)] [08.05.2012] [Комментариев: 0]