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