LINUX.ORG.RU
ФорумTalks

А давайте померяемся

 libyaml, ,


1

1

Тут знакомый парсил ямловский файл на несколько мегабайт, и получил странные результаты

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 раза. По сравнению с чистым яваскриптом, который еще не до конца оптимизирован.

Что-то тут не так.

★★★★★

Последнее исправление: Vit (всего исправлений: 9)
Ответ на: комментарий от stevejobs

Оно однако медленнее яваскрипта.

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

В 4 раза медленнее яваскрипта, и в полтора медленнее биндингов libyaml в яваскрипте.

Это конечно намного лучше, но все еще не объясняет, где тормоза.

Vit ★★★★★
() автор топика
Ответ на: мне очень стыдно :( от stevejobs

Нужны пруфы, что в вашем пыхе используется именно враппер libyaml. Потому что там легко мог болтаться и syck или что-то еще.

То же самое касается рубей. Я в первом посте давал строчку для принудительного запуска syck, дык вот его биндинги работают относительно быстро, но ценой совместимости (sucks less)

Vit ★★★★★
() автор топика
Ответ на: комментарий от Vit

А на прогретой яве померить можно?

честно говоря, так и не научился правильно мерять яву. Если просто циклом считать и распарсить этот самый файл 100000 раз, а потом измерить время выполнения еще 100000 и найти среднее, то это же не будет правильным измерением. Скастовать что ли кого-нибудь, или вообще отдельную тему запилить.

RedPossum ★★★★★
()
Ответ на: комментарий от Vit

Нужны пруфы

http://www.php.net/manual/ru/intro.yaml.php

Это расширение реализует стандрат сериализации данных » YAML Ain't Markup Language (YAML). Для обработки данных используется » библиотека LibYAML.

оффдок

с неправильно сконплеированным либямлом (последствия сноса с убунты перконы и водружения мускуля) у нас это расширение глючило и сегфолтилось на рандомных файлах

вывод - таки либямл

stevejobs ★★★★☆
()
Ответ на: комментарий от RedPossum

Если готового бенчмаркера нет, то просто 150 проходов, отбросив первые 50. Этого достаточно. Надо ж просто порядок цифр понять, а не посчитать до сотой процента.

Vit ★★★★★
() автор топика
Ответ на: комментарий от Vit

150 проходов, ЕМНИП, недостаточно для полной оптимизации jvm с флагом -server

RedPossum ★★★★★
()

Ох лол, ты взял портнул код пиямла в жс, который у меня уже несколько минут парсит файл(js-yaml@1, какой более быстрый JS чем питон однако), понял что так дело не пойдет, переписал чтобы было более быстро и бегом на лор.

Ну молодец чо. Еще пара сотен человек с таким же юзкейзом как у тебя и будет пиямл обгоняющий v8 под pypy (у меня кстате приблизительно равная скорость pypy с libyaml питоновским, но глядя на твой успех с жс версией, думаю все будет еще лучше).

Мораль сей басни такова: зачем это здесь?

zz ★★★★
()
Ответ на: комментарий от zz

Осталось разуть глаза, понять о чем топик и перестать задавать глупые вопросы.

Vit ★★★★★
() автор топика

Обновил первый пост пофикшеными тестами и ссылками на дополнительные бенчмарки, которые давались в треде.

Vit ★★★★★
() автор топика
Ответ на: комментарий от Vit

вот очень наивная реализация прогрева

import java.io.{File, FileInputStream}
import org.yaml.snakeyaml.Yaml

object yamlBnch {
  val WAMRING_TIMES=100;
  val BENCH_TIMES=50;

  def parseYaml():Int={
    val input = new FileInputStream(new File("data.yml"))
    val yaml = new Yaml()
    val data = yaml.load(input).asInstanceOf[java.util.LinkedHashMap[String, String]]
    input.close();
    data.size();
  }

  def main(args:Array[String]){
    println("Start warming")
    for ( i <- 0 until WAMRING_TIMES){
        parseYaml()
    }
    println("Stop warming")

    var timeResults=List.empty[Long]
    var keysCountResults=List.empty[Int]
    println("Start bench")

    for ( i <- 0 until BENCH_TIMES){
        val start=System.currentTimeMillis()
        var currentKeyResult=parseYaml()
        val stop=System.currentTimeMillis()
        keysCountResults=(currentKeyResult)::keysCountResults
        timeResults=(stop - start)::timeResults
    }

    println("Stop bench")

    val finalTimeResult = timeResults.sum/timeResults.size
    val finalKeySum=keysCountResults.sum

    println((finalTimeResult/1000.0)+" | "+finalKeySum)

  }
}

Собственно парсер тот же (snakeyaml). Результат:

 java -jar -client yamlbench.jar 
Start warming
Stop warming
Start bench
Stop bench
0.932 | 250

0.932 секунды

RedPossum ★★★★★
()
Последнее исправление: RedPossum (всего исправлений: 1)
Ответ на: комментарий от RedPossum

Спасибо. Проапдейтил первый пост.

Получается, что если js чуть подрихтовать на разборе имплиситов, то будет не медленнее явы. Не ожидал такого от v8. Целью было прикопаться к libyaml.

Vit ★★★★★
() автор топика
Ответ на: комментарий от RedPossum

И да, это таки scala, но не думаю что есть разница, ибо код только дергает явовые либы

RedPossum ★★★★★
()
Ответ на: комментарий от RedPossum

Не думаю что на серверной яве будут радикальные отличия.

Другое дело, что в JS приходится заниматься оптимизациями «на глаз», везде прикидывая, чтобы типы не перебились. По логам деоптимизатора полноценно работать нельзя - очень трудоемко. Это точно не для ынтырпрайза, и применимо далеко не везде. Yaml как раз удачно подвернулся, руку набить.

Vit ★★★★★
() автор топика
Ответ на: комментарий от Vit

На серверной яве оптимизации рантаймовые более лютые. Должна быть разница. Ближе к ночи надо будет попробовать тест

RedPossum ★★★★★
()

про тормознутость libyaml удивляться нисколько не стоит - достаточно посмотреть его исходник.

MKuznetsov ★★★★★
()
Ответ на: комментарий от RedPossum

Ничего так скала на первый взгляд.

SAA ★★★
()

Breaking news:

1. Перепроверил perl - действительно быстро. То ли там создание объектов дешевое, то ли биндинги более прямые. Перенес результаты в первый пост.

2. Перенес в первый пост результаты php, т.к. у него результаты похожие на perl, а значит правдоподобные.

3. Добавил простенький тест JSON, там ошибка раза в 2 из-за чтения файла, но для сравнения сойдет.

Vit ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.