Целочисленный индекс в мульти хэше лучше строкового индекса - PullRequest
1 голос
/ 16 июня 2011

Я написал этот пример кода, чтобы проверить, лучше ли целочисленный или строковый индекс в хэше 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 Int хэш занял: 428 миллисекунд

Я пытаюсь это сделать в Cygwin (Windows) и версия Perl 5.10.1

У меня есть пара вопросов здесь 1) Когда мы сохраняем целое число в Hash, вычисляется ли для этого ключ хеша, или Perl использует vale непосредственно в контейнере? 2) Вместо того, чтобы хранить строку, если я преобразую ее в целое число, получу ли я какие-либо улучшения производительности? 3) Если мне нужно сохранить 64-битное значение в качестве ключа в multihash, что даст большую производительность bigint или сохранить 64-битное значение в виде строки

1 Ответ

13 голосов
/ 16 июня 2011

Хеши в Perl имеют только строки в качестве ключей.Так что все ваши ключи $int_hash все равно приводятся в строки, и поэтому любая разница во времени выполнения между двумя версиями должна быть незначительной.

...