Улучшения скорости для chameneos-возвращения Perl в Игре Сравнительных тестов языка программирования

Когда-нибудь посмотревший Игра Сравнительных тестов языка программирования (раньше известный как Большая Перестрелка Языка)?

Perl имеет некоторую довольно здоровую конкуренцию там в данный момент. Мне также приходит в голову, что существуют, вероятно, некоторые места, что очки Perl могли быть улучшены. Самый большой находится в сценарии chameneos-возвращения прямо сейчас — версия Perl выполняет худшее из любого языка: в 1,626 раз медленнее, чем базовое решение C!

Существуют некоторые ограничения на то, как программы могут быть сделаны и оптимизированы, и существует интерпретируемый штраф Perl во время выполнения, но 1,626 раз? Там получен, чтобы быть чем-то, что может снизить время выполнения этой программы путь.

Взгляд на исходный код и проблему, как скорость может быть улучшена?

9
задан 5 revs, 3 users 81% 2 May 2012 в 18:35
поделиться

4 ответа

Я запустил исходный код через профилировщик Devel :: SmallProf . Выходные данные профиля слишком подробны для публикации здесь, но вы можете увидеть результаты самостоятельно, используя $ perl -d: SmallProf chameneos.pl 10000 (нет необходимости запускать его для 6000000 встреч, если вы действительно не хотите !) См. perlperf для получения более подробной информации о некоторых инструментах профилирования в Perl.

Оказывается, использование семафоров является основным узким местом. Львиная доля общего времени процессора тратится на проверку того, заблокирован ли семафор или нет. Хотя у меня не было достаточно времени, чтобы понять, почему в исходном коде используются семафоры, возможно, вы сможете обойтись без использования семафоров в целом. Вероятно, это ваш лучший шанс улучшить производительность кода.

6
ответ дан 4 December 2019 в 20:22
поделиться

Как отметил Zaid, Thread::Semaphore довольно медленный. Одной из оптимизаций может быть использование неявных блокировок общих переменных вместо них. Это должно быть быстрее, хотя я подозреваю, что не намного.

В целом, реализация потоков в Perl - отстой для любого вида использования, требующего много межпоточного взаимодействия. Она очень хорошо подходит для задач с небольшим количеством взаимодействий (так как в отличие от потоков CPython и CRuby они на самом деле вытесняющие).

Возможно, эту ситуацию можно улучшить, нам нужны лучшие примитивы.

2
ответ дан 4 December 2019 в 20:22
поделиться

У меня есть версия , основанная на другой версии Джесси Милликяна, которая, как мне кажется, никогда не публиковалась.

Я думаю, что он может работать примерно в 7 раз быстрее, чем текущая запись, и использует стандартные модули повсюду. Я не уверен, что он действительно соответствует всем правилам.

Я пробовал использовать на нем модуль fork , но мне кажется, он немного замедляет работу.

2
ответ дан 4 December 2019 в 20:22
поделиться

Кто-нибудь пробовал s / thread / fork / для записи Perl? Или Coro / Coro :: MP , хотя последний, вероятно, вызовет предложение « интересные альтернативные реализации ».

1
ответ дан 4 December 2019 в 20:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: