Лось действительно такой медленный?

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

no Moose;

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

3 ответа

Решение

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

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

__PACKAGE__->meta->make_immutable;

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

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

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

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

Смотрите Moose:: Cookbook:: FAQ:

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

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

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

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

MyClass->meta->make_immutable();

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

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

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

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

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

Другие вопросы по тегам