Когда-нибудь посмотревший Игра Сравнительных тестов языка программирования (раньше известный как Большая Перестрелка Языка)?
Perl имеет некоторую довольно здоровую конкуренцию там в данный момент. Мне также приходит в голову, что существуют, вероятно, некоторые места, что очки Perl могли быть улучшены. Самый большой находится в сценарии chameneos-возвращения прямо сейчас — версия Perl выполняет худшее из любого языка: в 1,626 раз медленнее, чем базовое решение C!
Существуют некоторые ограничения на то, как программы могут быть сделаны и оптимизированы, и существует интерпретируемый штраф Perl во время выполнения, но 1,626 раз? Там получен, чтобы быть чем-то, что может снизить время выполнения этой программы путь.
Взгляд на исходный код и проблему, как скорость может быть улучшена?
Я запустил исходный код через профилировщик Devel :: SmallProf
. Выходные данные профиля слишком подробны для публикации здесь, но вы можете увидеть результаты самостоятельно, используя $ perl -d: SmallProf chameneos.pl 10000
(нет необходимости запускать его для 6000000 встреч, если вы действительно не хотите !) См. perlperf для получения более подробной информации о некоторых инструментах профилирования в Perl.
Оказывается, использование семафоров является основным узким местом. Львиная доля общего времени процессора тратится на проверку того, заблокирован ли семафор или нет. Хотя у меня не было достаточно времени, чтобы понять, почему в исходном коде используются семафоры, возможно, вы сможете обойтись без использования семафоров в целом. Вероятно, это ваш лучший шанс улучшить производительность кода.
Как отметил Zaid, Thread::Semaphore довольно медленный. Одной из оптимизаций может быть использование неявных блокировок общих переменных вместо них. Это должно быть быстрее, хотя я подозреваю, что не намного.
В целом, реализация потоков в Perl - отстой для любого вида использования, требующего много межпоточного взаимодействия. Она очень хорошо подходит для задач с небольшим количеством взаимодействий (так как в отличие от потоков CPython и CRuby они на самом деле вытесняющие).
Возможно, эту ситуацию можно улучшить, нам нужны лучшие примитивы.
У меня есть версия , основанная на другой версии Джесси Милликяна, которая, как мне кажется, никогда не публиковалась.
Я думаю, что он может работать примерно в 7 раз быстрее, чем текущая запись, и использует стандартные модули повсюду. Я не уверен, что он действительно соответствует всем правилам.
Я пробовал использовать на нем модуль fork
, но мне кажется, он немного замедляет работу.
Кто-нибудь пробовал s / thread / fork / для записи Perl? Или Coro / Coro :: MP , хотя последний, вероятно, вызовет предложение « интересные альтернативные реализации ».