diff options
author | Florin Malita <fmalita@chromium.org> | 2018-06-08 12:25:38 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2018-06-08 17:45:33 +0000 |
commit | 7796f00dcfd09ca52140c4133ddc9bc197b832db (patch) | |
tree | ea438f8ab65f69a8d5e1b93c1d759d347a928959 /modules/skjson/src/SkJSONBench.cpp | |
parent | 61e66867ae10451fd365a676747a2c853bdd723d (diff) |
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 <mtklein@google.com>
Commit-Queue: Florin Malita <fmalita@chromium.org>
Diffstat (limited to 'modules/skjson/src/SkJSONBench.cpp')
-rw-r--r-- | modules/skjson/src/SkJSONBench.cpp | 167 |
1 files changed, 167 insertions, 0 deletions
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<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++) { + skjson::DOM dom(static_cast<const char*>(fCStringData->data())); + if (dom.root().is<skjson::NullValue>()) { + SkDebugf("!! Parsing failed.\n"); + return; + } + } + } + +private: + sk_sp<SkData> 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<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 |