Update text blob benchmark to reflect reality
w/ mtklein suggestions
Change-Id: Ifd7310ad71020c23514c663a0671400112b04e75
Reviewed-on: https://skia-review.googlesource.com/145824
Commit-Queue: Mike Klein <mtklein@google.com>
Commit-Queue: Herb Derby <herb@google.com>
Reviewed-by: Herb Derby <herb@google.com>
Auto-Submit: Herb Derby <herb@google.com>
diff --git a/bench/TextBlobBench.cpp b/bench/TextBlobBench.cpp
index b25c975..f839714 100644
--- a/bench/TextBlobBench.cpp
+++ b/bench/TextBlobBench.cpp
@@ -21,52 +21,68 @@
/*
* A trivial test which benchmarks the performance of a textblob with a single run.
*/
-class TextBlobBench : public Benchmark {
+class SkTextBlobBench : public Benchmark {
public:
- TextBlobBench() {}
+ SkTextBlobBench() {}
-protected:
void onDelayedSetup() override {
- fTypeface = sk_tool_utils::create_portable_typeface("serif", SkFontStyle());
- // make textblob
- SkPaint paint;
- paint.setTypeface(fTypeface);
- const char* text = "Hello blob!";
- SkTDArray<uint16_t> glyphs;
- size_t len = strlen(text);
- glyphs.append(paint.textToGlyphs(text, len, nullptr));
- paint.textToGlyphs(text, len, glyphs.begin());
+ fPaint.setTypeface(sk_tool_utils::create_portable_typeface("serif", SkFontStyle()));
+ fPaint.setTextEncoding(SkPaint::kGlyphID_TextEncoding);
- SkTextBlobBuilder builder;
+ // This text seems representative in both length and letter frequency.
+ const char* text = "Keep your sentences short, but not overly so.";
- paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding);
- const SkTextBlobBuilder::RunBuffer& run = builder.allocRun(paint, glyphs.count(), 10, 10,
- nullptr);
- memcpy(run.glyphs, glyphs.begin(), glyphs.count() * sizeof(uint16_t));
-
- fBlob = builder.make();
+ fGlyphs.setCount(fPaint.textToGlyphs(text, strlen(text), nullptr));
+ fPaint.textToGlyphs(text, strlen(text), fGlyphs.begin());
}
+ sk_sp<SkTextBlob> makeBlob() {
+ const SkTextBlobBuilder::RunBuffer& run =
+ fBuilder.allocRunPosH(fPaint, fGlyphs.count(), 10, nullptr);
+ for (int i = 0; i < fGlyphs.count(); i++) {
+ run.glyphs[i] = fGlyphs[i];
+ run. pos[i] = (i+1) * 10;
+ }
+ return fBuilder.make();
+ }
+
+private:
+ SkTextBlobBuilder fBuilder;
+ SkPaint fPaint;
+ SkTDArray<uint16_t> fGlyphs;
+
+ typedef Benchmark INHERITED;
+};
+
+class TextBlobCachedBench : public SkTextBlobBench {
const char* onGetName() override {
- return "TextBlobBench";
+ return "TextBlobCachedBench";
}
void onDraw(int loops, SkCanvas* canvas) override {
SkPaint paint;
- // To ensure maximum caching, we just redraw the blob at the same place everytime
+ auto blob = this->makeBlob();
for (int i = 0; i < loops; i++) {
- canvas->drawTextBlob(fBlob, 0, 0, paint);
+ // To ensure maximum caching, we just redraw the blob at the same place everytime
+ canvas->drawTextBlob(blob, 0, 0, paint);
}
}
-
-private:
-
- sk_sp<SkTextBlob> fBlob;
- SkTDArray<uint16_t> fGlyphs;
- sk_sp<SkTypeface> fTypeface;
-
- typedef Benchmark INHERITED;
};
-DEF_BENCH( return new TextBlobBench(); )
+class TextBlobFirstTimeBench : public SkTextBlobBench {
+ const char* onGetName() override {
+ return "TextBlobFirstTimeBench";
+ }
+
+ void onDraw(int loops, SkCanvas* canvas) override {
+ SkPaint paint;
+
+ for (int i = 0; i < loops; i++) {
+ canvas->drawTextBlob(this->makeBlob(), 0, 0, paint);
+ }
+ }
+};
+
+DEF_BENCH( return new TextBlobCachedBench(); )
+DEF_BENCH( return new TextBlobFirstTimeBench(); )