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 этого вроде не наблюдается, интересно почему.

Monday, January 18, 2010

Борьба с тормозами в firefox

Довольно надоедливая временами фича в firefox - session store. С тремя рядами табов она начинает ощутимо подтормаживать, при этом процесс firefox-bin может отжирать 80-90% CPU.

По умолчанию сохранение сессии происходит каждые 10 секунд. Для изменения надо выставить параметр  browser.sessionstore.interval (миллисекунды) в число побольше, например 300000.  Или как вариант - постоянно закрывать ненужные в данный момент табы.

Sunday, January 17, 2010

Блоки бывают разные

Блок в питоне - это кусок текста, который выполняется как одно целое. К блокам относятся модули, функции, классы, etc.. Ими же определяются области видимости локальных переменных (а не кодом внутри {}, как например в Perl).

Поэтому если объявить переменную в цикле, она будет видна после его окончания:
l = ['a', 'b', 'c', 'd']
for i, j in enumerate(l):
if j == 'c': break
print l[i] # c

Thursday, January 14, 2010

Об автовивификации в Perl

Как известно, в Perl ссылки могут создаваться автоматически во многих случаях. Эта фича называется автовивификацией. В документации расплывчато говорится, что автовивификация имеет место быть в lvalue-контексте. Иными словами, если код подразумевает изменение значения переменной, то он может вызвать автовивификацию. Например:


use strict;
use Data::Dumper;
my $arr;
1 for @$arr;
print Dumper $arr # $VAR1 = [];

Казалось бы, никакого изменения элементов массива тут нет. Однако foreach создает тот самый lvalue-контекст, поскольку позволяет менять элементы массива (через переменную $_ по умолчанию). Таким же свойством обладают операторы grep и map.

Для сравнения:

use strict;
my $arr;
print @$arr;

Can't use an undefined value as an ARRAY reference at -e line 1.


Весьма странным в этом свете выглядит автовивификация при использовании функций defined и exists:


use strict;
my $x;
1 if exists $x->{key};
print $x; # HASH(0x86f37d0)


С другой стороны, если бы все было логично и не противоречиво, это был бы уже не Perl :)

Присваивание в перле и С

В перл выражение с любым вариантом оператора присваивания (=, *=, x=, etc.) возвращает новое значение переменной в левой части, как и в С:
$a = $b = $c = 0;
В перле, однако, присваивание возвращает lvalue. Поэтому можно изменить переменную более 1 раза таким образом:
($temp -= 32) *= 5/9;

Wednesday, January 6, 2010

DVI vs DSub

Плюсы подключения LCD-монитора через DVI:
  • Более высокая четкость изображения (заметно при высоких разрешениях).
  • Улучшенная цветопередача.
  • Защищенность от наводок.
  • Кнопка автоподстройки изображения не нужна.
В свете этого комплектация многих современных 24" мониторов по дефолту VGA-кабелем выглядит как то странно...