JSONBench.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  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. #include "bench/Benchmark.h"
  8. #include "include/core/SkData.h"
  9. #include "include/core/SkStream.h"
  10. #include "src/utils/SkJSON.h"
  11. #if defined(SK_BUILD_FOR_ANDROID)
  12. static constexpr const char* kBenchFile = "/data/local/tmp/bench.json";
  13. #else
  14. static constexpr const char* kBenchFile = "/tmp/bench.json";
  15. #endif
  16. class JsonBench : public Benchmark {
  17. public:
  18. protected:
  19. const char* onGetName() override { return "json_skjson"; }
  20. bool isSuitableFor(Backend backend) override { return backend == kNonRendering_Backend; }
  21. void onPerCanvasPreDraw(SkCanvas*) override {
  22. fData = SkData::MakeFromFileName(kBenchFile);
  23. if (!fData) {
  24. SkDebugf("!! Could not open bench file: %s\n", kBenchFile);
  25. }
  26. }
  27. void onPerCanvasPostDraw(SkCanvas*) override {
  28. fData = nullptr;
  29. }
  30. void onDraw(int loops, SkCanvas*) override {
  31. if (!fData) return;
  32. for (int i = 0; i < loops; i++) {
  33. skjson::DOM dom(static_cast<const char*>(fData->data()), fData->size());
  34. if (dom.root().is<skjson::NullValue>()) {
  35. SkDebugf("!! Parsing failed.\n");
  36. return;
  37. }
  38. }
  39. }
  40. private:
  41. sk_sp<SkData> fData;
  42. using INHERITED = Benchmark;
  43. };
  44. DEF_BENCH( return new JsonBench; )
  45. #if (0)
  46. #include "rapidjson/document.h"
  47. class RapidJsonBench : public Benchmark {
  48. public:
  49. protected:
  50. const char* onGetName() override { return "json_rapidjson"; }
  51. bool isSuitableFor(Backend backend) override { return backend == kNonRendering_Backend; }
  52. void onPerCanvasPreDraw(SkCanvas*) override {
  53. if (auto stream = SkStream::MakeFromFile(kBenchFile)) {
  54. SkASSERT(stream->hasLength());
  55. fCStringData = SkData::MakeUninitialized(stream->getLength() + 1);
  56. auto* data8 = reinterpret_cast<uint8_t*>(fCStringData->writable_data());
  57. SkAssertResult(stream->read(data8, stream->getLength()) == stream->getLength());
  58. data8[stream->getLength()] = '\0';
  59. } else {
  60. SkDebugf("!! Could not open bench file: %s\n", kBenchFile);
  61. }
  62. }
  63. void onPerCanvasPostDraw(SkCanvas*) override {
  64. fCStringData = nullptr;
  65. }
  66. void onDraw(int loops, SkCanvas*) override {
  67. if (!fCStringData) return;
  68. for (int i = 0; i < loops; i++) {
  69. rapidjson::Document doc;
  70. doc.Parse(static_cast<const char*>(fCStringData->data()));
  71. if (doc.HasParseError()) {
  72. SkDebugf("!! Parsing failed.\n");
  73. return;
  74. }
  75. }
  76. }
  77. private:
  78. sk_sp<SkData> fCStringData;
  79. using INHERITED = Benchmark;
  80. };
  81. DEF_BENCH( return new RapidJsonBench; )
  82. #endif
  83. #if (0)
  84. #include "pjson.h"
  85. class PJsonBench : public Benchmark {
  86. public:
  87. protected:
  88. const char* onGetName() override { return "json_pjson"; }
  89. bool isSuitableFor(Backend backend) override { return backend == kNonRendering_Backend; }
  90. void onPerCanvasPreDraw(SkCanvas*) override {
  91. if (auto stream = SkStream::MakeFromFile(kBenchFile)) {
  92. SkASSERT(stream->hasLength());
  93. fCStringData = SkData::MakeUninitialized(stream->getLength() + 1);
  94. auto* data8 = reinterpret_cast<uint8_t*>(fCStringData->writable_data());
  95. SkAssertResult(stream->read(data8, stream->getLength()) == stream->getLength());
  96. data8[stream->getLength()] = '\0';
  97. } else {
  98. SkDebugf("!! Could not open bench file: %s\n", kBenchFile);
  99. }
  100. }
  101. void onPerCanvasPostDraw(SkCanvas*) override {
  102. fCStringData = nullptr;
  103. }
  104. void onDraw(int loops, SkCanvas*) override {
  105. if (!fCStringData) return;
  106. for (int i = 0; i < loops; i++) {
  107. // Copy needed for in-place operation.
  108. auto data = SkData::MakeWithCopy(fCStringData->data(), fCStringData->size());
  109. pjson::document doc;
  110. if (!doc.deserialize_in_place(static_cast<char*>(data->writable_data()))) {
  111. SkDebugf("!! Parsing failed.\n");
  112. return;
  113. }
  114. }
  115. }
  116. private:
  117. sk_sp<SkData> fCStringData;
  118. using INHERITED = Benchmark;
  119. };
  120. DEF_BENCH( return new PJsonBench; )
  121. #endif