Я написал этот пример кода, чтобы проверить, что лучше в хэше perl: целочисленный или строковый индекс.
use Time::Local;
use Time::HiRes qw/gettimeofday/;
my %string_hash;
my %int_hash;
$i_count = 100;
$j_count = 100;
$k_count = 1000;
foreach $i (0..$i_count)
{
foreach $i (0..$j_count)
{
foreach $k (0..$k_count)
{
$i += 0;$j += 0;$k += 0;
$int_hash{$i}->{$j}->{$k} = 1;
$string_hash{"$i"}->{"$j"}->{"$k"} = 1;
}
}
}
my $profile = gettimeofday();
print "String hash start:$profile\n";
foreach $i (keys %string_hash)
{
foreach $j(keys %{ $string_hash{$i} })
{
foreach $k(keys %{ $string_hash{$i}{$j} })
{
$i += 0;$j += 0;$k += 0;
$val = $string_hash{$i}->{$j}->{$k};
}
}
}
printf("String hash took:%d millisec\n", (gettimeofday()-$profile)*1000);
$profile = gettimeofday();
print "Int hash start:$profile\n";
foreach $i (keys %int_hash)
{
foreach $j(keys %{ $int_hash{$i} })
{
foreach $k(keys %{ $int_hash{$i}{$j} })
{
$i += 0;$j += 0;$k += 0;
$val = $int_hash{$i}->{$j}->{$k};
}
}
}
printf("Int hash took:%d millisec\n", (gettimeofday()-$profile)*1000);
Я получил этот вывод
$ perl hashs.pl Начало хэша строки: 1308199085.84375 Время хеширования строки: 500 миллисекунд Начало хэша целого числа: 1308199086.34379 Занято хэша строки: 428 миллисекунд
Я пытаюсь это сделать в Cygwin (Windows), а версия Perl — 5.10.1.
У меня есть пара вопросов: 1) Когда мы сохраняем целое число в Hash, вычисляется ли для него хеш-ключ или Perl использует значение непосредственно в ведре? 2) Вместо хранения строки, если я преобразую ее в целое число, получу ли я какие-либо улучшения производительности? 3) Если мне нужно сохранить 64-битное значение в качестве ключа в мультихэше, что даст лучшую производительность bigint или сохранит 64-битное значение в виде строки