diff options
author | Florin Malita <fmalita@chromium.org> | 2018-06-19 11:27:20 -0400 |
---|---|---|
committer | Kevin Lubick <kjlubick@google.com> | 2018-06-19 18:23:30 +0000 |
commit | 80452bee11ebe6708ea459ea34e526a44c04bdb0 (patch) | |
tree | 2e74fe66a6554f81909188b423f7ce4055cdaea3 /bench | |
parent | 96aa535b782f31df0f063213c2958acba32a808d (diff) |
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 <mtklein@google.com>
Reviewed-by: Kevin Lubick <kjlubick@google.com>
Commit-Queue: Florin Malita <fmalita@chromium.org>
Diffstat (limited to 'bench')
-rw-r--r-- | bench/JSONBench.cpp | 161 |
1 files changed, 161 insertions, 0 deletions
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<const char*>(fData->data()), fData->size()); + if (dom.root().is<skjson::NullValue>()) { + SkDebugf("!! Parsing failed.\n"); + return; + } + } + } + +private: + sk_sp<SkData> 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<uint8_t*>(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<const char*>(fCStringData->data())); + if (doc.HasParseError()) { + SkDebugf("!! Parsing failed.\n"); + return; + } + } + } + +private: + sk_sp<SkData> 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<uint8_t*>(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<char*>(data->writable_data()))) { + SkDebugf("!! Parsing failed.\n"); + return; + } + } + } + +private: + sk_sp<SkData> fCStringData; + + using INHERITED = Benchmark; +}; + +DEF_BENCH( return new PJsonBench; ) + +#endif |