Я написал довольно большую программу на Perl, которая создает PDF на основе HTML и запросов к базе данных, которая фактически работает как браузер. Общий объем исходного кода составляет более 1 МБ. Программа оценивает HTML, создает запросы SQL и извлекает данные, ищет изображения на диске или загружает их с серверов HTTP, создает структуру документа, выполняет все расчеты макета и, наконец, создает PDF.
Мне пришлось выяснить, как ускорить операцию несколькими способами. Исходя из этого, я утверждаю, что Perl работает довольно быстро, и многие задачи, выполняемые в Perl быстро и успешно, занимают много времени в C и даже в C ++.
Существует два способа сделать Perl медленным или потребляющим память: большое количество сложных структур данных - им нужно много памяти - и большое количество вычислений. Да, в Perl вычисления действительно очень медленные. Простой термин, как
$a = $b * $c
довольно много времени в Perl, но очень быстро на любом компилируемом языке. Операнды здесь могут даже быть целыми числами, а не переменными с плавающей точкой - это медленно. Я полагаю, что именно по этой причине Perl набрал довольно плохие результаты в конкурсе языковых перестрелок [http://shootout.alioth.debian.org/](The Computer Benchmarks Game).
Я обнаружил, что моя довольно большая программа - она использует много ядра Perl и дополнительные CPAN-модули - чтобы быстро запускаться, несмотря на то, что она не совсем понятна.
Работает очень хорошо ... пока не дойдет до расчета размеров текста и координат макета. Это очень много времени. После этого я написал небольшие тестовые программы на Perl, выполняющие миллионы арифметических вычислений, и обнаружил, что они очень медленные.
Кроме того, я использую и объектно-ориентированный подход для моделирования каждого элемента макета. Каждый объект представлен хешем - по крайней мере, около 10 КБ на объект. Если для печати требуется большой объем данных, потребление памяти в несколько сотен мегабайт не является чем-то необычным для этой программы.
Итак, у меня все еще есть веская причина переместить часть, вычисляющую макет, в C, используя структуры, где у меня теперь есть хэши с фиксированными ключами и целочисленная арифметика C, где теперь Perl выполняет медленную работу.
Но все остальное было сделано и протестировано быстро и работает так быстро, что я не вижу причин для изменений. Я также нахожу Perl-код гораздо более удобным для написания и тестирования, чем C-код. Многие модули CPAN предоставляют решения, которые вам не нужно разрабатывать самостоятельно. Многие из них хорошо проверены и задокументированы.
После этого довольно продолжительного обсуждения я заключаю: если это будет программа для сервера или командной строки, рассмотрим Perl. Но если эта программа должна создавать огромные структуры данных или много арифметики, подумайте о чем-нибудь быстрее. Иногда это может быть программа на Perl с модулем, написанным на C.