Является ли целочисленный индекс в мультихэше лучше, чем строковый индекс

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


person Raghuram    schedule 16.06.2011    source источник
comment
использовать модуль Benchmark   -  person ysth    schedule 16.06.2011
comment
Если вы используете последовательные целые числа, начиная с 0, вы должны использовать массив, который будет значительно быстрее, чем хэш.   -  person Eric Strom    schedule 17.06.2011
comment
Это не последовательно и читать данные из файла, который является bigint   -  person Raghuram    schedule 17.06.2011


Ответы (1)


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

person Chris Jester-Young    schedule 16.06.2011