Приходил тут к нам Python, ел на завтрак JSON
Случилась тут у нас на работе загогулина. В процессе декомпозиции всех наших проектов на микросервисы решили мы воспользоваться шансом и поотпимизировать что можно. В частности - решили поменять JSON парсер, а то он у нас был самодельный, с поддержкой XML и хитрой валидации, но зато несовместимый ни с чем.
Пошли профайлить плюсовые JSON парсеры. Потыкали boost с его свойственными деревьями - оказалось на удивление медленно, причём и в компиляции и в рантайме. Посмотрели на Poco::JSON - более менее фурычит, хотя звёзд с неба и не хватает. Пошли смотреть что ещё бывает в современном мире C++...
А потом по приколу прогнали Python парсер на тех же тестовых данных. И тихо офигели: мерзкий питон уделал наши крутые библиотки в несколько раз. Проверили в разных аспектах - всё верно, питон быстрее плюсов. Даже для эксперимента вызвали из плюсов питоновский парсер - и он всё равно летает.
Как теперь жить с этим знанием? Переписывать всё нафик на Питоне? Таскать везде с собой кусок питона? И самый главный вопрос - как вообще такое могло получиться?!

no subject
А GSON не смотрели? или он только на java?
no subject
no subject
no subject
no subject
no subject
no subject
no subject
Мы пробовали на основе JSON Schema генерить SAX-парсеры, и это было довольно быстро, но уж очень муторно.
no subject
no subject
no subject
no subject
no subject
- а как это?
- а какая разница, все равно ж на проводах время теряется?
no subject
/usr/bin/timeРазница существенна по трём причинам:
1) иногда ходят большие объёмы данных и хочется их побыстрее обрабатывать
2) для межсервисного обмена "время проводов" уже не покрывает время разбора
3) менеджмент хочет цифр
no subject
no subject
no subject
no subject
надо вывалить на суд общественности бенчмарки и исходники, авось и объяснения нашлись бы?!
no subject
import json with open('test-2.json') as f: d = f.read() for n in range(0, 25): j = json.loads(d) for i in j['items']: v = int(i['data'][3][3])no subject
#include <iostream> #include <fstream> #include <string> #include "Poco/JSON/JSON.h" #include "Poco/JSON/Parser.h" #include "Poco/JSON/Handler.h" #include "Poco/JSON/Object.h" #include "Poco/Dynamic/Var.h" #include "handler.hh" const char* JSON_FILE = "test-2.json"; using namespace std; using namespace Poco; using namespace Poco::JSON; using namespace Poco::Dynamic; void parse_file(const std::string& buffer) { Parser parser; Var result = parser.parse(buffer); DynamicStruct data = *(result.extract<Object::Ptr>()); Var items = data["items"]; for(auto item = items.begin(); item != items.end(); ++item) { int v = (*item)["data"][3][3].convert<int>(); } } int main(void) { ifstream ifs(JSON_FILE); std::string buffer((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>()); for (int j = 0; j < TIMES; ++j) parse_file(buffer); }no subject
Не знаю, как оно там относительно питона, но скорее всего RapidJSON быстрее будет.
no subject
no subject
Вообще вот : http://lionet.livejournal.com/118853.html
no subject