Wednesday, January 20, 2010

Небольшая оптимизация использования памяти в Perl

Хэши часто используются в Perl для поиска уникальных элементов в массиве. Распространенная идиома:
my @uniq = keys %{{ map { $_=> 1 } @list }};

Здесь создается анонимный хэш с элементами массива в качестве ключей и 1 в качестве значений. Так вот, если вместо 1 использовать undef, процесс отъедает заметно меньше памяти (в зависимости от количества элементов в исходном массиве). В Perl 5.8.8:
$ perl -e 'my %x; $x{$_} = 1 for 0..1000_000; system "ps -ovsz $$"'
VSZ
75508
$ perl -e 'my %x; $x{$_} = undef for 0..1000_000; system "ps -ovsz $$"'
VSZ
71572


В 5.10 этого вроде не наблюдается, интересно почему.

No comments:

Post a Comment