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