1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2018 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "bench/Benchmark.h" 9cb93a386Sopenharmony_ci#include "include/core/SkData.h" 10cb93a386Sopenharmony_ci#include "include/core/SkStream.h" 11cb93a386Sopenharmony_ci#include "src/utils/SkJSON.h" 12cb93a386Sopenharmony_ci 13cb93a386Sopenharmony_ci#if defined(SK_BUILD_FOR_ANDROID) 14cb93a386Sopenharmony_cistatic constexpr const char* kBenchFile = "/data/local/tmp/bench.json"; 15cb93a386Sopenharmony_ci#else 16cb93a386Sopenharmony_cistatic constexpr const char* kBenchFile = "/tmp/bench.json"; 17cb93a386Sopenharmony_ci#endif 18cb93a386Sopenharmony_ci 19cb93a386Sopenharmony_ciclass JsonBench : public Benchmark { 20cb93a386Sopenharmony_cipublic: 21cb93a386Sopenharmony_ci 22cb93a386Sopenharmony_ciprotected: 23cb93a386Sopenharmony_ci const char* onGetName() override { return "json_skjson"; } 24cb93a386Sopenharmony_ci 25cb93a386Sopenharmony_ci bool isSuitableFor(Backend backend) override { return backend == kNonRendering_Backend; } 26cb93a386Sopenharmony_ci 27cb93a386Sopenharmony_ci void onPerCanvasPreDraw(SkCanvas*) override { 28cb93a386Sopenharmony_ci fData = SkData::MakeFromFileName(kBenchFile); 29cb93a386Sopenharmony_ci if (!fData) { 30cb93a386Sopenharmony_ci SkDebugf("!! Could not open bench file: %s\n", kBenchFile); 31cb93a386Sopenharmony_ci } 32cb93a386Sopenharmony_ci } 33cb93a386Sopenharmony_ci 34cb93a386Sopenharmony_ci void onPerCanvasPostDraw(SkCanvas*) override { 35cb93a386Sopenharmony_ci fData = nullptr; 36cb93a386Sopenharmony_ci } 37cb93a386Sopenharmony_ci 38cb93a386Sopenharmony_ci void onDraw(int loops, SkCanvas*) override { 39cb93a386Sopenharmony_ci if (!fData) return; 40cb93a386Sopenharmony_ci 41cb93a386Sopenharmony_ci for (int i = 0; i < loops; i++) { 42cb93a386Sopenharmony_ci skjson::DOM dom(static_cast<const char*>(fData->data()), fData->size()); 43cb93a386Sopenharmony_ci if (dom.root().is<skjson::NullValue>()) { 44cb93a386Sopenharmony_ci SkDebugf("!! Parsing failed.\n"); 45cb93a386Sopenharmony_ci return; 46cb93a386Sopenharmony_ci } 47cb93a386Sopenharmony_ci } 48cb93a386Sopenharmony_ci } 49cb93a386Sopenharmony_ci 50cb93a386Sopenharmony_ciprivate: 51cb93a386Sopenharmony_ci sk_sp<SkData> fData; 52cb93a386Sopenharmony_ci 53cb93a386Sopenharmony_ci using INHERITED = Benchmark; 54cb93a386Sopenharmony_ci}; 55cb93a386Sopenharmony_ci 56cb93a386Sopenharmony_ciDEF_BENCH( return new JsonBench; ) 57cb93a386Sopenharmony_ci 58cb93a386Sopenharmony_ci#if (0) 59cb93a386Sopenharmony_ci 60cb93a386Sopenharmony_ci#include "rapidjson/document.h" 61cb93a386Sopenharmony_ci 62cb93a386Sopenharmony_ciclass RapidJsonBench : public Benchmark { 63cb93a386Sopenharmony_cipublic: 64cb93a386Sopenharmony_ci 65cb93a386Sopenharmony_ciprotected: 66cb93a386Sopenharmony_ci const char* onGetName() override { return "json_rapidjson"; } 67cb93a386Sopenharmony_ci 68cb93a386Sopenharmony_ci bool isSuitableFor(Backend backend) override { return backend == kNonRendering_Backend; } 69cb93a386Sopenharmony_ci 70cb93a386Sopenharmony_ci void onPerCanvasPreDraw(SkCanvas*) override { 71cb93a386Sopenharmony_ci if (auto stream = SkStream::MakeFromFile(kBenchFile)) { 72cb93a386Sopenharmony_ci SkASSERT(stream->hasLength()); 73cb93a386Sopenharmony_ci fCStringData = SkData::MakeUninitialized(stream->getLength() + 1); 74cb93a386Sopenharmony_ci auto* data8 = reinterpret_cast<uint8_t*>(fCStringData->writable_data()); 75cb93a386Sopenharmony_ci SkAssertResult(stream->read(data8, stream->getLength()) == stream->getLength()); 76cb93a386Sopenharmony_ci data8[stream->getLength()] = '\0'; 77cb93a386Sopenharmony_ci 78cb93a386Sopenharmony_ci } else { 79cb93a386Sopenharmony_ci SkDebugf("!! Could not open bench file: %s\n", kBenchFile); 80cb93a386Sopenharmony_ci } 81cb93a386Sopenharmony_ci } 82cb93a386Sopenharmony_ci 83cb93a386Sopenharmony_ci void onPerCanvasPostDraw(SkCanvas*) override { 84cb93a386Sopenharmony_ci fCStringData = nullptr; 85cb93a386Sopenharmony_ci } 86cb93a386Sopenharmony_ci 87cb93a386Sopenharmony_ci void onDraw(int loops, SkCanvas*) override { 88cb93a386Sopenharmony_ci if (!fCStringData) return; 89cb93a386Sopenharmony_ci 90cb93a386Sopenharmony_ci for (int i = 0; i < loops; i++) { 91cb93a386Sopenharmony_ci rapidjson::Document doc; 92cb93a386Sopenharmony_ci doc.Parse(static_cast<const char*>(fCStringData->data())); 93cb93a386Sopenharmony_ci if (doc.HasParseError()) { 94cb93a386Sopenharmony_ci SkDebugf("!! Parsing failed.\n"); 95cb93a386Sopenharmony_ci return; 96cb93a386Sopenharmony_ci } 97cb93a386Sopenharmony_ci } 98cb93a386Sopenharmony_ci } 99cb93a386Sopenharmony_ci 100cb93a386Sopenharmony_ciprivate: 101cb93a386Sopenharmony_ci sk_sp<SkData> fCStringData; 102cb93a386Sopenharmony_ci 103cb93a386Sopenharmony_ci using INHERITED = Benchmark; 104cb93a386Sopenharmony_ci}; 105cb93a386Sopenharmony_ci 106cb93a386Sopenharmony_ciDEF_BENCH( return new RapidJsonBench; ) 107cb93a386Sopenharmony_ci 108cb93a386Sopenharmony_ci#endif 109cb93a386Sopenharmony_ci 110cb93a386Sopenharmony_ci#if (0) 111cb93a386Sopenharmony_ci 112cb93a386Sopenharmony_ci#include "pjson.h" 113cb93a386Sopenharmony_ci 114cb93a386Sopenharmony_ciclass PJsonBench : public Benchmark { 115cb93a386Sopenharmony_cipublic: 116cb93a386Sopenharmony_ci 117cb93a386Sopenharmony_ciprotected: 118cb93a386Sopenharmony_ci const char* onGetName() override { return "json_pjson"; } 119cb93a386Sopenharmony_ci 120cb93a386Sopenharmony_ci bool isSuitableFor(Backend backend) override { return backend == kNonRendering_Backend; } 121cb93a386Sopenharmony_ci 122cb93a386Sopenharmony_ci void onPerCanvasPreDraw(SkCanvas*) override { 123cb93a386Sopenharmony_ci if (auto stream = SkStream::MakeFromFile(kBenchFile)) { 124cb93a386Sopenharmony_ci SkASSERT(stream->hasLength()); 125cb93a386Sopenharmony_ci fCStringData = SkData::MakeUninitialized(stream->getLength() + 1); 126cb93a386Sopenharmony_ci auto* data8 = reinterpret_cast<uint8_t*>(fCStringData->writable_data()); 127cb93a386Sopenharmony_ci SkAssertResult(stream->read(data8, stream->getLength()) == stream->getLength()); 128cb93a386Sopenharmony_ci data8[stream->getLength()] = '\0'; 129cb93a386Sopenharmony_ci 130cb93a386Sopenharmony_ci } else { 131cb93a386Sopenharmony_ci SkDebugf("!! Could not open bench file: %s\n", kBenchFile); 132cb93a386Sopenharmony_ci } 133cb93a386Sopenharmony_ci } 134cb93a386Sopenharmony_ci 135cb93a386Sopenharmony_ci void onPerCanvasPostDraw(SkCanvas*) override { 136cb93a386Sopenharmony_ci fCStringData = nullptr; 137cb93a386Sopenharmony_ci } 138cb93a386Sopenharmony_ci 139cb93a386Sopenharmony_ci void onDraw(int loops, SkCanvas*) override { 140cb93a386Sopenharmony_ci if (!fCStringData) return; 141cb93a386Sopenharmony_ci 142cb93a386Sopenharmony_ci for (int i = 0; i < loops; i++) { 143cb93a386Sopenharmony_ci // Copy needed for in-place operation. 144cb93a386Sopenharmony_ci auto data = SkData::MakeWithCopy(fCStringData->data(), fCStringData->size()); 145cb93a386Sopenharmony_ci pjson::document doc; 146cb93a386Sopenharmony_ci if (!doc.deserialize_in_place(static_cast<char*>(data->writable_data()))) { 147cb93a386Sopenharmony_ci SkDebugf("!! Parsing failed.\n"); 148cb93a386Sopenharmony_ci return; 149cb93a386Sopenharmony_ci } 150cb93a386Sopenharmony_ci } 151cb93a386Sopenharmony_ci } 152cb93a386Sopenharmony_ci 153cb93a386Sopenharmony_ciprivate: 154cb93a386Sopenharmony_ci sk_sp<SkData> fCStringData; 155cb93a386Sopenharmony_ci 156cb93a386Sopenharmony_ci using INHERITED = Benchmark; 157cb93a386Sopenharmony_ci}; 158cb93a386Sopenharmony_ci 159cb93a386Sopenharmony_ciDEF_BENCH( return new PJsonBench; ) 160cb93a386Sopenharmony_ci 161cb93a386Sopenharmony_ci#endif 162