Я писал файловый парсер в Perl, поэтому мне пришлось перебирать файл. Файл состоит из записей фиксированной длины, и я хотел создать отдельную функцию, которая анализирует данную запись и вызывает эту функцию в цикле. Однако конечный результат оказался медленным с большими файлами, и я предполагал, что я не должен использовать внешнюю функцию. Поэтому я сделал несколько фиктивных тестов с вызовом функции и без нее в цикле:
[А]
foreach (1 .. 10000000) {
$a = &get_string();
}
sub get_string {
return sprintf("%s\n", 'abc');
}
[В]
foreach (1 .. 10000000) {
$a = sprintf "%s\n", 'abc';
}
Измерение показало, что код работает примерно в 3-4 раза медленнее кода B. Я заранее знал, что код A должен работать медленнее, но все же я был удивлен, что разница в этом велика. Также пытались запустить аналогичные тесты с Python и Java. В коде Python эквивалент был примерно на 20% медленнее, чем B, а код Java запускался более или менее с одинаковой скоростью (как и ожидалось). Изменение функции из sprintf на что-то другое не показало существенных различий.
Есть ли способ помочь Perl быстрее запускать такие циклы? Я делаю что-то совершенно неправильное здесь или это функция Perl, что вызовы функций являются такими накладными расходами?