EncodeBench.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. /*
  2. * Copyright 2016 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/SkBitmap.h"
  9. #include "include/core/SkStream.h"
  10. #include "include/encode/SkJpegEncoder.h"
  11. #include "include/encode/SkPngEncoder.h"
  12. #include "include/encode/SkWebpEncoder.h"
  13. #include "tools/Resources.h"
  14. // Like other Benchmark subclasses, Encoder benchmarks are run by:
  15. // nanobench --match ^Encode_
  16. //
  17. // There is no corresponding DecodeBench class. Decoder benchmarks are run by:
  18. // nanobench --benchType skcodec --images your_images_directory
  19. class EncodeBench : public Benchmark {
  20. public:
  21. using Encoder = bool (*)(SkWStream*, const SkPixmap&);
  22. EncodeBench(const char* filename, Encoder encoder, const char* encoderName)
  23. : fSourceFilename(filename)
  24. , fEncoder(encoder)
  25. , fName(SkStringPrintf("Encode_%s_%s", filename, encoderName)) {}
  26. bool isSuitableFor(Backend backend) override { return backend == kNonRendering_Backend; }
  27. const char* onGetName() override { return fName.c_str(); }
  28. void onDelayedSetup() override {
  29. SkAssertResult(GetResourceAsBitmap(fSourceFilename, &fBitmap));
  30. }
  31. void onDraw(int loops, SkCanvas*) override {
  32. while (loops-- > 0) {
  33. SkPixmap pixmap;
  34. SkAssertResult(fBitmap.peekPixels(&pixmap));
  35. SkNullWStream dst;
  36. SkAssertResult(fEncoder(&dst, pixmap));
  37. SkASSERT(dst.bytesWritten() > 0);
  38. }
  39. }
  40. private:
  41. const char* fSourceFilename;
  42. Encoder fEncoder;
  43. SkString fName;
  44. SkBitmap fBitmap;
  45. };
  46. static bool encode_jpeg(SkWStream* dst, const SkPixmap& src) {
  47. SkJpegEncoder::Options opts;
  48. opts.fQuality = 90;
  49. return SkJpegEncoder::Encode(dst, src, opts);
  50. }
  51. static bool encode_webp_lossy(SkWStream* dst, const SkPixmap& src) {
  52. SkWebpEncoder::Options opts;
  53. opts.fCompression = SkWebpEncoder::Compression::kLossy;
  54. opts.fQuality = 90;
  55. return SkWebpEncoder::Encode(dst, src, opts);
  56. }
  57. static bool encode_webp_lossless(SkWStream* dst, const SkPixmap& src) {
  58. SkWebpEncoder::Options opts;
  59. opts.fCompression = SkWebpEncoder::Compression::kLossless;
  60. opts.fQuality = 90;
  61. return SkWebpEncoder::Encode(dst, src, opts);
  62. }
  63. static bool encode_png(SkWStream* dst,
  64. const SkPixmap& src,
  65. SkPngEncoder::FilterFlag filters,
  66. int zlibLevel) {
  67. SkPngEncoder::Options opts;
  68. opts.fFilterFlags = filters;
  69. opts.fZLibLevel = zlibLevel;
  70. return SkPngEncoder::Encode(dst, src, opts);
  71. }
  72. #define PNG(FLAG, ZLIBLEVEL) [](SkWStream* d, const SkPixmap& s) { \
  73. return encode_png(d, s, SkPngEncoder::FilterFlag::FLAG, ZLIBLEVEL); }
  74. static const char* srcs[2] = {"images/mandrill_512.png", "images/color_wheel.jpg"};
  75. // The Android Photos app uses a quality of 90 on JPEG encodes
  76. DEF_BENCH(return new EncodeBench(srcs[0], &encode_jpeg, "JPEG"));
  77. DEF_BENCH(return new EncodeBench(srcs[1], &encode_jpeg, "JPEG"));
  78. // TODO: What is the appropriate quality to use to benchmark WEBP encodes?
  79. DEF_BENCH(return new EncodeBench(srcs[0], encode_webp_lossy, "WEBP"));
  80. DEF_BENCH(return new EncodeBench(srcs[1], encode_webp_lossy, "WEBP"));
  81. DEF_BENCH(return new EncodeBench(srcs[0], encode_webp_lossless, "WEBP_LL"));
  82. DEF_BENCH(return new EncodeBench(srcs[1], encode_webp_lossless, "WEBP_LL"));
  83. DEF_BENCH(return new EncodeBench(srcs[0], PNG(kAll, 6), "PNG"));
  84. DEF_BENCH(return new EncodeBench(srcs[0], PNG(kAll, 3), "PNG_3"));
  85. DEF_BENCH(return new EncodeBench(srcs[0], PNG(kAll, 1), "PNG_1"));
  86. DEF_BENCH(return new EncodeBench(srcs[0], PNG(kSub, 6), "PNG_6s"));
  87. DEF_BENCH(return new EncodeBench(srcs[0], PNG(kSub, 3), "PNG_3s"));
  88. DEF_BENCH(return new EncodeBench(srcs[0], PNG(kSub, 1), "PNG_1s"));
  89. DEF_BENCH(return new EncodeBench(srcs[0], PNG(kNone, 6), "PNG_6n"));
  90. DEF_BENCH(return new EncodeBench(srcs[0], PNG(kNone, 3), "PNG_3n"));
  91. DEF_BENCH(return new EncodeBench(srcs[0], PNG(kNone, 1), "PNG_1n"));
  92. DEF_BENCH(return new EncodeBench(srcs[1], PNG(kAll, 6), "PNG"));
  93. DEF_BENCH(return new EncodeBench(srcs[1], PNG(kAll, 3), "PNG_3"));
  94. DEF_BENCH(return new EncodeBench(srcs[1], PNG(kAll, 1), "PNG_1"));
  95. DEF_BENCH(return new EncodeBench(srcs[1], PNG(kSub, 6), "PNG_6s"));
  96. DEF_BENCH(return new EncodeBench(srcs[1], PNG(kSub, 3), "PNG_3s"));
  97. DEF_BENCH(return new EncodeBench(srcs[1], PNG(kSub, 1), "PNG_1s"));
  98. DEF_BENCH(return new EncodeBench(srcs[1], PNG(kNone, 6), "PNG_6n"));
  99. DEF_BENCH(return new EncodeBench(srcs[1], PNG(kNone, 3), "PNG_3n"));
  100. DEF_BENCH(return new EncodeBench(srcs[1], PNG(kNone, 1), "PNG_1n"));
  101. #undef PNG