Запустив и версию C ++, и версию Ruby с strace
, мы можем получить некоторые подсказки, почему версия C ++ медленнее.
Использование исходного кода Linux для тестирования (65000 файлов):
strace -o '|wc' cpp_recursion
86417 518501 9463879
strace -o '|wc' ruby -e 'Dir.glob("**/*")'
30563 180115 1827588
Мы видим, что версия C ++ выполняет почти в 3 раза больше операций, чем Ruby.
При более внимательном рассмотрении вывода strace вы обнаружите, что обе программы используют getdents
для извлечения записей каталога, но версия C ++ запускает lstat
для каждого отдельного файла, а версия Ruby - нет.
Я могу только заключить, что версия C ++ не реализована так эффективно (или, возможно, служит другой цели), как версия Ruby. Разница в скорости - это не проблема языка, а проблема реализации.
N.B. Версия C ++ с оптимизацией -O
выполняется за 0,347 с, а версия Ruby - за 0,304 с. По крайней мере, в Linux lstat
, похоже, не слишком много накладных расходов. Возможно, в Windows ситуация иная.