Полезные трюки с микрооптимизацией

Темы:

В рассылке perl5-porters был задан вопрос, почему две операции сильно отличаются по скорости (в пользу do):

do { ; }
{ ; }

Zefram указал на то, что пустой блок рассматривается как цикл, который выполняется один раз, и для него формируется фрейм-контекст с поддержкой динамических операций вроде next. В то время как для do устанавливается только область видимости, что гораздо быстрее.

Кроме этого было замечено, что операция ; это отдельная операция, которая устанавливает номер строки. В противовес этому , не имеет подобного оверхеда. Например:

$x = 1; $y = 2; print "$x $y";
$x = 1, $y = 2, print "$x $y";

Оба выражения выполняют одно и то же, но вторая запись будет работать быстрее.

Эта информация сразу вдохновила Питера Рэбиттсона использовать этот простой трюк на практике. Он продемонстрировал коммит, который на 15% увеличивает производительность DBIx::Class просто заменив все ; на , в генерируемом коде для строкового eval. Этот прирост становится заметен на резалтсетах с ≥1000 рядов.