From 80452bee11ebe6708ea459ea34e526a44c04bdb0 Mon Sep 17 00:00:00 2001 From: Florin Malita Date: Tue, 19 Jun 2018 11:27:20 -0400 Subject: Fold SkJSON into Skia/utils It's a tiny, core-ish component -- might as well treat as such to simplify dependencies. Change-Id: I6f31ce2d151f9a629d88bfc7f15d64891d5150c0 Reviewed-on: https://skia-review.googlesource.com/135780 Reviewed-by: Mike Klein Reviewed-by: Kevin Lubick Commit-Queue: Florin Malita --- bench/JSONBench.cpp | 161 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 161 insertions(+) create mode 100644 bench/JSONBench.cpp (limited to 'bench') diff --git a/bench/JSONBench.cpp b/bench/JSONBench.cpp new file mode 100644 index 0000000000..4ef1d6c01b --- /dev/null +++ b/bench/JSONBench.cpp @@ -0,0 +1,161 @@ +/* + * 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 { + fData = SkData::MakeFromFileName(kBenchFile); + if (!fData) { + SkDebugf("!! Could not open bench file: %s\n", kBenchFile); + } + } + + void onPerCanvasPostDraw(SkCanvas*) override { + fData = nullptr; + } + + void onDraw(int loops, SkCanvas*) override { + if (!fData) return; + + for (int i = 0; i < loops; i++) { + skjson::DOM dom(static_cast(fData->data()), fData->size()); + if (dom.root().is()) { + SkDebugf("!! Parsing failed.\n"); + return; + } + } + } + +private: + sk_sp fData; + + using INHERITED = Benchmark; +}; + +DEF_BENCH( return new JsonBench; ) + +#if (0) + +#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