2018-06-08 16:25:38 +00:00
|
|
|
/*
|
|
|
|
* 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 {
|
2018-06-14 19:03:21 +00:00
|
|
|
fData = SkData::MakeFromFileName(kBenchFile);
|
|
|
|
if (!fData) {
|
2018-06-08 16:25:38 +00:00
|
|
|
SkDebugf("!! Could not open bench file: %s\n", kBenchFile);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void onPerCanvasPostDraw(SkCanvas*) override {
|
2018-06-14 19:03:21 +00:00
|
|
|
fData = nullptr;
|
2018-06-08 16:25:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void onDraw(int loops, SkCanvas*) override {
|
2018-06-14 19:03:21 +00:00
|
|
|
if (!fData) return;
|
2018-06-08 16:25:38 +00:00
|
|
|
|
|
|
|
for (int i = 0; i < loops; i++) {
|
2018-06-14 19:03:21 +00:00
|
|
|
skjson::DOM dom(static_cast<const char*>(fData->data()), fData->size());
|
2018-06-08 16:25:38 +00:00
|
|
|
if (dom.root().is<skjson::NullValue>()) {
|
|
|
|
SkDebugf("!! Parsing failed.\n");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
2018-06-14 19:03:21 +00:00
|
|
|
sk_sp<SkData> fData;
|
2018-06-08 16:25:38 +00:00
|
|
|
|
|
|
|
using INHERITED = Benchmark;
|
|
|
|
};
|
|
|
|
|
|
|
|
DEF_BENCH( return new JsonBench; )
|
|
|
|
|
2018-06-14 20:16:01 +00:00
|
|
|
#if (0)
|
2018-06-08 16:25:38 +00:00
|
|
|
|
|
|
|
#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
|