Каждый раз, когда я загружаю новую копию Rakudo Perl 6, я запускаю следующее выражение, чтобы получить представление о его текущей производительности:
say [+] 1 .. 100000;
И скорость возрастает, но каждый раз для вычисления имеется заметная задержка (несколько секунд). Для сравнения, что-то вроде этого в Perl 5 (или других интерпретируемых языках) возвращается почти мгновенно:
use List::Util 'sum';
print sum(1 .. 100000), "\n";
или в Ruby (также почти мгновенно):
(1 .. 100000).inject(0) {|sum,x| sum+x}
Переписывание выражения как Perl6 loop
заканчивается примерно в два раза быстрее, чем уменьшение диапазона, но для простого вычисления это еще очень заметная задержка (более секунды):
my $sum;
loop (my $x = 1; $x <= 100000; $x++) {$sum += $x}
Итак, мой вопрос: какие аспекты реализации Perl6 вызывают эти проблемы производительности? И должно ли это улучшаться со временем, или это накладные расходы, неудачный побочный эффект модели "все является объектом", которую использует Perl6?
И, наконец, как насчет конструкции loop
быстрее, чем оператор сокращения [+]
? Я бы подумал, что цикл приведет к более полному ops, чем сокращение.
EDIT:
Я бы принял ответы mortiz
и hobbs
, если бы мог. То, что все обрабатывается как вызов метода, более непосредственно отвечает на вопрос, почему [+]
работает медленно, поэтому его можно получить.