Ключевые слова:perl, benchmark, optimization, (найти похожие документы)
Date: Sun, 28 Oct 2001 12:36:44 +0000 (UTC)
From: Pavel Ammosov <[email protected]>
Newsgroups: fido7.ru.perl
Subject: [Perl] Скорость выполнения eval блока
SM> Дано: массив чисел @array.
SM> Требуется: сумма элементов массива.
SM> Вопрос: Является ли вариант
SM> eval(join("+",@votes))
SM> менее эффективным чем простой цикл с суммировнием, а если да, то
SM> в чем и на сколько?
Да, строковой eval будет каждый раз перекомпилироватся, что приведет к
большим тормозам.
#!/usr/bin/perl -w
use strict;
use Benchmark;
my @foo;
for (1 .. 200) {
push @foo, int(rand(300));
}
timethese(-5, { # -5 это фича новых perl'ов. Значит исполнять 5 секунд,
# минимум
'eval' => sub { my $sum = eval(join("+",@foo)) },
'for' => sub { my $sum; for (@foo) { $sum += $_ }} ,
});
perl mt.pl
Benchmark: running eval, for, each for at least 5 CPU seconds...
eval: 5 wallclock secs ( 5.27 usr + 0.00 sys = 5.27 CPU) @ 919.54/s (n=4846)
for: 6 wallclock secs ( 5.24 usr + 0.01 sys = 5.25 CPU) @ 8143.62/s (n=42754)
Вариант с eval в 9 раз медленнее.
SM>Другими словами, большой ли overhead у eval?
У eval "строка" - да. у eval {block} - нет.
--
Павел Аммосов, email: [email protected], icq uin: 19210183
www: http://isabase.philol.msu.ru/~apavel/