Тут знакомый парсил ямловский файл на несколько мегабайт, и получил странные результаты
js-yaml (https://github.com/nodeca/js-yaml) - около 1 секунды
ruby/python нативные биндинги к libyaml - около 30 секунд
Колесо пинал, дверь хлопал, гудок жал, глаза протирал. Прошу подтвердить. Я был в курсе, что pyyaml не до конца вменяем, но насчет libyaml не подозревал.
Данные https://gist.github.com/anonymous/5028302
Запускался просто импорт, с разными библиотеками.
time ruby -r yaml -e "YAML.load_file 'data.yml'"
time ruby -r psych -e "Psych.load_file 'data.yml'"
time python -c "import yaml; yaml.load(open('data.yml'))"
time js-yaml -j data.yml > /dev/null
time ruby -r syck -e "Syck.load_file 'data.yml'"
Update
После разбора и улучшений выяснилось, что libyaml медленнее «всего лишь» в 2-4 раза нативного JS. Оказывается, у поциента не открытый, а закрытый перелом. Что не снимает вопроса «какого хрена?»
time js-yaml -j data.yml > /dev/null
real 0m1.420s
user 0m1.272s
sys 0m0.148s
то же самое, но без cli:
time node -e "var yaml=require('js-yaml'), text=require('fs').readFileSync('data.yml', 'utf-8'); yaml.load(text);"
real 0m0.984s
user 0m0.940s
sys 0m0.040s
нода с libyaml:
time node -e "require('libyaml').readFileSync('data.yml');"
real 0m3.424s
user 0m3.300s
sys 0m0.136s
питон с libyaml:
time python -c "import yaml; from yaml import CLoader as Loader; yaml.load(open('data.yml'),Loader=Loader)"
real 0m5.530s
user 0m5.268s
sys 0m0.212s
Perl (хм, неплохо, перепроверил)
time perl -MYAML::XS -e 'YAML::XS::LoadFile "data.yml"'
real 0m0.484s
user 0m0.456s
sys 0m0.024s
PHP (ну раз перл быстрый, наверное и PHP может быть)
time php -r 'yaml_parse_file("/Users/olegchiruhin/Documents/data.yml");'
php -r 'yaml_parse_file("/Users/olegchiruhin/Documents/data.yml");'
0,49s user
0,04s system
99% cpu
0,537 total
В рубях 2.0 ~ как в питоне, 6 секунд.
syck в рубях (не полная реализация, биндинги) - 0.9 секунд
java (snakeyaml) - 1.7 секунды без прогревва и 0.9 с прогревом ( А давайте померяемся (комментарий) и А давайте померяемся (комментарий) )
JSON node.js (просто для сравнения)
time node -e "var text=require('fs').readFileSync('data.json', 'utf-8'); JSON.parse(text);"
real 0m0.265s
user 0m0.152s
sys 0m0.040s
Итого
Даже в php/perl, где (возможно) дешевое создание объектов или качественные биндинги, профит от libyaml всего в 2 раза. По сравнению с чистым яваскриптом, который еще не до конца оптимизирован.
Что-то тут не так.