From 7796f00dcfd09ca52140c4133ddc9bc197b832db Mon Sep 17 00:00:00 2001 From: Florin Malita Date: Fri, 8 Jun 2018 12:25:38 -0400 Subject: SkJson For now this is only wired to a bench and a couple of tests. Local numbers, for a ~500KB BM "compressed" json: micros bench 2456.54 json_rapidjson nonrendering 1192.38 json_skjson nonrendering Change-Id: I7b3514f84c7c525d1787722c43ad6095e3692563 Reviewed-on: https://skia-review.googlesource.com/127622 Reviewed-by: Mike Klein Commit-Queue: Florin Malita --- modules/skjson/src/SkJSONBench.cpp | 167 +++++++++++++++++++++++++++++++++++++ 1 file changed, 167 insertions(+) create mode 100644 modules/skjson/src/SkJSONBench.cpp (limited to 'modules/skjson/src/SkJSONBench.cpp') diff --git a/modules/skjson/src/SkJSONBench.cpp b/modules/skjson/src/SkJSONBench.cpp new file mode 100644 index 0000000000..4be3b972ab --- /dev/null +++ b/modules/skjson/src/SkJSONBench.cpp @@ -0,0 +1,167 @@ +/* + * Copyright 2018 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "Benchmark.h" +#include "SkData.h" +#include "SkJSON.h" +#include "SkStream.h" + +#if defined(SK_BUILD_FOR_ANDROID) +static constexpr const char* kBenchFile = "/data/local/tmp/bench.json"; +#else +static constexpr const char* kBenchFile = "/tmp/bench.json"; +#endif + +class JsonBench : public Benchmark { +public: + +protected: + const char* onGetName() override { return "json_skjson"; } + + bool isSuitableFor(Backend backend) override { return backend == kNonRendering_Backend; } + + void onPerCanvasPreDraw(SkCanvas*) override { + if (auto stream = SkStream::MakeFromFile(kBenchFile)) { + SkASSERT(stream->hasLength()); + fCStringData = SkData::MakeUninitialized(stream->getLength() + 1); + auto* data8 = reinterpret_cast(fCStringData->writable_data()); + SkAssertResult(stream->read(data8, stream->getLength()) == stream->getLength()); + data8[stream->getLength()] = '\0'; + + } else { + SkDebugf("!! Could not open bench file: %s\n", kBenchFile); + } + } + + void onPerCanvasPostDraw(SkCanvas*) override { + fCStringData = nullptr; + } + + void onDraw(int loops, SkCanvas*) override { + if (!fCStringData) return; + + for (int i = 0; i < loops; i++) { + skjson::DOM dom(static_cast(fCStringData->data())); + if (dom.root().is()) { + SkDebugf("!! Parsing failed.\n"); + return; + } + } + } + +private: + sk_sp fCStringData; + + using INHERITED = Benchmark; +}; + +DEF_BENCH( return new JsonBench; ) + +#if !defined(SK_BUILD_FOR_ANDROID_FRAMEWORK) + +#include "rapidjson/document.h" + +class RapidJsonBench : public Benchmark { +public: + +protected: + const char* onGetName() override { return "json_rapidjson"; } + + bool isSuitableFor(Backend backend) override { return backend == kNonRendering_Backend; } + + void onPerCanvasPreDraw(SkCanvas*) override { + if (auto stream = SkStream::MakeFromFile(kBenchFile)) { + SkASSERT(stream->hasLength()); + fCStringData = SkData::MakeUninitialized(stream->getLength() + 1); + auto* data8 = reinterpret_cast(fCStringData->writable_data()); + SkAssertResult(stream->read(data8, stream->getLength()) == stream->getLength()); + data8[stream->getLength()] = '\0'; + + } else { + SkDebugf("!! Could not open bench file: %s\n", kBenchFile); + } + } + + void onPerCanvasPostDraw(SkCanvas*) override { + fCStringData = nullptr; + } + + void onDraw(int loops, SkCanvas*) override { + if (!fCStringData) return; + + for (int i = 0; i < loops; i++) { + rapidjson::Document doc; + doc.Parse(static_cast(fCStringData->data())); + if (doc.HasParseError()) { + SkDebugf("!! Parsing failed.\n"); + return; + } + } + } + +private: + sk_sp fCStringData; + + using INHERITED = Benchmark; +}; + +DEF_BENCH( return new RapidJsonBench; ) + +#endif + +#if (0) + +#include "pjson.h" + +class PJsonBench : public Benchmark { +public: + +protected: + const char* onGetName() override { return "json_pjson"; } + + bool isSuitableFor(Backend backend) override { return backend == kNonRendering_Backend; } + + void onPerCanvasPreDraw(SkCanvas*) override { + if (auto stream = SkStream::MakeFromFile(kBenchFile)) { + SkASSERT(stream->hasLength()); + fCStringData = SkData::MakeUninitialized(stream->getLength() + 1); + auto* data8 = reinterpret_cast(fCStringData->writable_data()); + SkAssertResult(stream->read(data8, stream->getLength()) == stream->getLength()); + data8[stream->getLength()] = '\0'; + + } else { + SkDebugf("!! Could not open bench file: %s\n", kBenchFile); + } + } + + void onPerCanvasPostDraw(SkCanvas*) override { + fCStringData = nullptr; + } + + void onDraw(int loops, SkCanvas*) override { + if (!fCStringData) return; + + for (int i = 0; i < loops; i++) { + // Copy needed for in-place operation. + auto data = SkData::MakeWithCopy(fCStringData->data(), fCStringData->size()); + pjson::document doc; + if (!doc.deserialize_in_place(static_cast(data->writable_data()))) { + SkDebugf("!! Parsing failed.\n"); + return; + } + } + } + +private: + sk_sp fCStringData; + + using INHERITED = Benchmark; +}; + +DEF_BENCH( return new PJsonBench; ) + +#endif -- cgit v1.2.3