Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.


Сообщения - y8

Страницы: [1]
1
Perl / как оптимизировать
« : 06 Марта 2006, 18:49:57 »
Код теста, Benchmark.pm я не очень доверяю, из-за точности вычеслений.
#!/usr/bin/perl -w

	
use 
Time::HiRes qw(gettimeofday tv_interval);
	
use 
strict;

	
my @= (... 10000);

	
my $count 1000;
	
my @= (... $count);


	
open (NULL, \'>nul\'); # nul для венды, или /dev/null для никсов

	
	
	
my $foreach = sub
	
	
{
	
	
	
	
foreach (@a)
	
	
	
{
	
	
	
	
	
print NULL $_;
	
	
	
};
	
	
};

	
	
	
my $for = sub
	
	
{
	
	
	
	
	
for (@a)
	
	
	
	
{
	
	
	
	
	
	
print NULL $_;
	
	
	
	
};
	
	
};

	
	
	
my $map = sub
	
	
{
	
	
	
	
my $cnt = @a;

	
	
	
	
	
while ($cnt)
	
	
	
	
{
	
	
	
	
	
print NULL $a[$_];
	
	
	
	
	
$cnt--;
	
	
	
	
}
	
	
};

	
my @foreach;
	
my @while;
	
my @map;

	
print "Элементов в массиве: ", scalar @a ,"\\n";

	
print "Выполняем $count прогонов for ...";


	
	
for (@c)
	
{
	
	
	
my $t0 = [gettimeofday];
	
	
	
&$for;
	
	
	
push (@while, tv_interval($t0));
	
}

	
print "OK!\\n";
	
my $ttl = 0;
	
map { $ttl += $_ } @while;
	
my $avrg = $ttl / scalar(@while);
	
printf("Потраченно: %.5f (%f, %s)\\n", $avrg, $ttl, scalar(@while));

	
print "Выполняем $count прогонов foreach ...";

	
	
for (@c)
	
{
	
	
my $t0 = [gettimeofday];
	
	
&$foreach;
	
	
push (@foreach, tv_interval($t0));

	
}

	
print "OK!\\n";
	
$ttl = 0;
	
map { $ttl += $_ } @foreach;
	
$avrg = $ttl / scalar(@foreach);
	
printf("Потраченно: %.5f (%f, %s)\\n", $avrg, $ttl, scalar(@foreach));

	
print "Выполняем $count прогонов while ...";

	
	
for (@c)
	
{
	
	
my $t0 = [gettimeofday];
	
	
&$map;
	
	
push (@map, tv_interval($t0));

	
}

	
print "OK!\\n";
	
$ttl = 0;
	
map { $ttl += $_ } @foreach;
	
$avrg = $ttl / scalar(@map);
	
printf("Потраченно: %.5f (%f, %s)\\n", $avrg, $ttl, scalar(@map));

2
Perl / как оптимизировать
« : 06 Марта 2006, 18:48:59 »
Элементов в массиве: 10000
for ... OK!
Потраченно: 0.02864с (28.642092с, 1000 итеарций)
foreach ... OK!
Потраченно: 0.02914с (29.141574с, 1000 итеарций)
while ... OK!
Потраченно: 0.02914с (29.141574с, 1000 итеарций)

Разницы в целом нет, но for чуточку быстрее.

3
Perl / как оптимизировать
« : 06 Марта 2006, 17:21:02 »
Всё, ступил жутко. for и foreach - это синонимы.
А с  while это

my $cnt scalar(@a);

while (
$cnt) {
[do 
something]
$cnt--;
}


Сейчас смотрю на сколько с while будет быстрее/медленне.
А по поводу foreach keys и while (my ($key, $val) = each %hash) - это действительно быстрее, ибо each не перебирет ключи отделяя их от значений, а тупо отадёт пары в том подрядке в каком, они лежат в памяти. На эту тему есть даже рецепт в cookbook.

4
Perl / как оптимизировать
« : 06 Марта 2006, 16:48:31 »
Хм. Версия перла какая? А если while попробовать?

5
Perl / как оптимизировать
« : 06 Марта 2006, 12:31:58 »
1) Никогда не используйте foreach для хешей, темболе больших.

[perl]
($key, $value) = each %hash;
[/perl]

2) Если у вас размер массива в процессе жизни менятся не будет, использование for будет более быстрым вариантом, чем foreach.

Можно получить цельный кусок кода? Дабы посмотреть что там на самом деле.

Кстати, заюзайте Time::HiRes для проверки времени выполнения.

Страницы: [1]