Случилась тут у нас на работе загогулина. В процессе декомпозиции всех наших проектов на микросервисы решили мы воспользоваться шансом и поотпимизировать что можно. В частности - решили поменять JSON парсер, а то он у нас был самодельный, с поддержкой XML и хитрой валидации, но зато несовместимый ни с чем.
Пошли профайлить плюсовые JSON парсеры. Потыкали boost с его свойственными деревьями - оказалось на удивление медленно, причём и в компиляции и в рантайме. Посмотрели на Poco::JSON - более менее фурычит, хотя звёзд с неба и не хватает. Пошли смотреть что ещё бывает в современном мире C++...
А потом по приколу прогнали Python парсер на тех же тестовых данных. И тихо офигели: мерзкий питон уделал наши крутые библиотки в несколько раз. Проверили в разных аспектах - всё верно, питон быстрее плюсов. Даже для эксперимента вызвали из плюсов питоновский парсер - и он всё равно летает.
Как теперь жить с этим знанием? Переписывать всё нафик на Питоне? Таскать везде с собой кусок питона? И самый главный вопрос - как вообще такое могло получиться?!
no subject
Date: 2015-08-03 04:05 pm (UTC)#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); }