Лось действительно такой медленный? - PullRequest
11 голосов
/ 02 июля 2010

Я недавно скачал Moose.Экспериментально я переписал существующий модуль в Moose.Кажется, это удобный способ избежать написания большого количества повторяющегося кода.Я запустил тесты модуля и заметил, что он немного задерживается.Я профилировал код с помощью -d: DProf, и кажется, что включение строки

no Moose;

в код увеличивает время выполнения примерно на 0,25 секунды (на моем компьютере).Это типично?Я делаю что-то не так, я неправильно это установил или нам действительно стоит ожидать такой большой задержки?

Ответы [ 3 ]

20 голосов
/ 02 июля 2010

Да, есть немного штраф за использование Moose.Однако, это только штраф за запуск, а не во время выполнения;если вы все написали правильно, то все будет довольно быстро во время выполнения.

Вы также включили эту строку:

__PACKAGE__->meta->make_immutable;

во все ваши классы, когда вы no Moose;?Вызов этого метода сделает его (время выполнения) быстрее (за счет времени запуска).В частности, создание и уничтожение объектов эффективно «встроено» в ваш класс и больше не вызывает мета API.Настоятельно рекомендуется сделать ваши классы неизменными.Это делает ваш код намного быстрее, с небольшими затратами времени компиляции.Это будет особенно заметно при создании многих объектов. 1 2

Однако иногда эта стоимость все еще слишком великамного.Если вы используете Moose внутри скрипта или каким-либо другим способом, когда время компиляции составляет значительную долю вашего общего времени использования, попробуйте выполнить s/Moose/Moo/g - если вы не используете модули MooseX, вы можете переключиться на Moo , цель которого - быть быстрее (при запуске) при сохранении 90% гибкости Moose.

Поскольку вы работаете с веб-приложением, рассматривали ли вы возможность использования Plack / PSGI?

1 Из документов make_immutable, в Moose :: Cookbook :: Basics :: Recipe7
2 См. Также статью Стевана Литтла: Почему make_immutable рекомендуется для классов Moose

12 голосов
/ 02 июля 2010

См. Moose :: Cookbook :: FAQ :

Я слышал, что Moose медленный, это правда?

Опять этот хитрый,да и нет.

Во-первых, ничто в жизни не является бесплатным, и некоторые функции Moose стоят дороже, чем другие.Кроме того, в соответствии с политикой Moose взимается плата только за используемые вами функции, и мы делаем все возможное, чтобы не налагать лишних затрат на выполнение кода для функций, которые вы не используете.Конечно, использование самого Moose требует некоторых накладных расходов, но в основном это время компиляции.На данный момент у нас есть несколько вариантов для получения необходимой вам скорости.

В настоящее время мы предоставляем возможность сделать ваши классы неизменяемыми в качестве средства повышения скорости.Это будет означать немного большую стоимость времени компиляции, но увеличение скорости выполнения (особенно при построении объектов) довольно значительно.Это можно сделать с помощью следующего кода:

MyClass->meta->make_immutable();

Мы регулярно конвертируем горячие точки Class :: MOP в XS.Флориан Рагвиц и Ювал Когман в настоящее время работают над тем, как скомпилировать ваши аксессоры и экземпляры непосредственно в C, чтобы каждый мог наслаждаться быстрым OO.

С другой стороны, я работаю в сетиприложение, которое использует Dancer и Moose .Поскольку приложение работает как демон HTTPD, после инициализации сервера все это не имеет значения.Производительность кажется более чем достаточной для моих требований на ограниченном оборудовании или виртуальных серверах.

Использование Moose и Dancer для этого проекта принесло дополнительное преимущество, заключающееся в том, что мое небольшое демонстрационное приложение сократилось с примерно 5000 строк до менее чем 1000 строк.1024 *

От того, от чего зависит ваше приложение, зависит один из тех компромиссов, которые вы должны учитывать.Приложения CGI становятся более отзывчивыми благодаря ограничению зависимостей.

6 голосов
/ 02 июля 2010

Ваш вопрос немного обманчив. Да, у Moose есть измеримая стоимость запуска, но после этого она не замедляется. Если стоимость запуска непомерно высока, вы всегда можете демонизировать свое приложение.

...