Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
105 changes: 51 additions & 54 deletions third_party/txt/benchmarks/paragraph_benchmarks.cc
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,26 @@

namespace txt {

static void BM_ParagraphShortLayout(benchmark::State& state) {
class ParagraphFixture : public benchmark::Fixture {
public:
void SetUp(const benchmark::State& state) {
font_collection_ = GetTestFontCollection();

bitmap_ = std::make_unique<SkBitmap>();
bitmap_->allocN32Pixels(1000, 1000);
canvas_ = std::make_unique<SkCanvas>(*bitmap_);
canvas_->clear(SK_ColorWHITE);
}

void TearDown(const benchmark::State& state) { font_collection_.reset(); }

protected:
std::shared_ptr<FontCollection> font_collection_;
std::unique_ptr<SkCanvas> canvas_;
std::unique_ptr<SkBitmap> bitmap_;
};

BENCHMARK_F(ParagraphFixture, ShortLayout)(benchmark::State& state) {
const char* text = "Hello World";
auto icu_text = icu::UnicodeString::fromUTF8(text);
std::u16string u16_text(icu_text.getBuffer(),
Expand All @@ -45,7 +64,7 @@ static void BM_ParagraphShortLayout(benchmark::State& state) {
txt::TextStyle text_style;
text_style.font_families = std::vector<std::string>(1, "Roboto");
text_style.color = SK_ColorBLACK;
txt::ParagraphBuilderTxt builder(paragraph_style, GetTestFontCollection());
txt::ParagraphBuilderTxt builder(paragraph_style, font_collection_);

builder.PushStyle(text_style);
builder.AddText(u16_text);
Expand All @@ -56,9 +75,8 @@ static void BM_ParagraphShortLayout(benchmark::State& state) {
paragraph->Layout(300);
}
}
BENCHMARK(BM_ParagraphShortLayout);

static void BM_ParagraphLongLayout(benchmark::State& state) {
BENCHMARK_F(ParagraphFixture, LongLayout)(benchmark::State& state) {
const char* text =
"This is a very long sentence to test if the text will properly wrap "
"around and go to the next line. Sometimes, short sentence. Longer "
Expand Down Expand Up @@ -87,7 +105,7 @@ static void BM_ParagraphLongLayout(benchmark::State& state) {
text_style.font_families = std::vector<std::string>(1, "Roboto");
text_style.color = SK_ColorBLACK;

txt::ParagraphBuilderTxt builder(paragraph_style, GetTestFontCollection());
txt::ParagraphBuilderTxt builder(paragraph_style, font_collection_);

builder.PushStyle(text_style);
builder.AddText(u16_text);
Expand All @@ -98,9 +116,8 @@ static void BM_ParagraphLongLayout(benchmark::State& state) {
paragraph->Layout(300);
}
}
BENCHMARK(BM_ParagraphLongLayout);

static void BM_ParagraphJustifyLayout(benchmark::State& state) {
BENCHMARK_F(ParagraphFixture, JustifyLayout)(benchmark::State& state) {
const char* text =
"This is a very long sentence to test if the text will properly wrap "
"around and go to the next line. Sometimes, short sentence. Longer "
Expand Down Expand Up @@ -130,7 +147,7 @@ static void BM_ParagraphJustifyLayout(benchmark::State& state) {
text_style.font_families = std::vector<std::string>(1, "Roboto");
text_style.color = SK_ColorBLACK;

txt::ParagraphBuilderTxt builder(paragraph_style, GetTestFontCollection());
txt::ParagraphBuilderTxt builder(paragraph_style, font_collection_);

builder.PushStyle(text_style);
builder.AddText(u16_text);
Expand All @@ -141,9 +158,8 @@ static void BM_ParagraphJustifyLayout(benchmark::State& state) {
paragraph->Layout(300);
}
}
BENCHMARK(BM_ParagraphJustifyLayout);

static void BM_ParagraphManyStylesLayout(benchmark::State& state) {
BENCHMARK_F(ParagraphFixture, ManyStylesLayout)(benchmark::State& state) {
const char* text = "-";
auto icu_text = icu::UnicodeString::fromUTF8(text);
std::u16string u16_text(icu_text.getBuffer(),
Expand All @@ -154,7 +170,7 @@ static void BM_ParagraphManyStylesLayout(benchmark::State& state) {
txt::TextStyle text_style;
text_style.font_families = std::vector<std::string>(1, "Roboto");
text_style.color = SK_ColorBLACK;
txt::ParagraphBuilderTxt builder(paragraph_style, GetTestFontCollection());
txt::ParagraphBuilderTxt builder(paragraph_style, font_collection_);
for (int i = 0; i < 1000; ++i) {
builder.PushStyle(text_style);
builder.AddText(u16_text);
Expand All @@ -165,9 +181,8 @@ static void BM_ParagraphManyStylesLayout(benchmark::State& state) {
paragraph->Layout(300);
}
}
BENCHMARK(BM_ParagraphManyStylesLayout);

static void BM_ParagraphTextBigO(benchmark::State& state) {
BENCHMARK_DEFINE_F(ParagraphFixture, TextBigO)(benchmark::State& state) {
std::vector<uint16_t> text;
for (uint16_t i = 0; i < state.range(0); ++i) {
text.push_back(i % 5 == 0 ? ' ' : i);
Expand All @@ -181,7 +196,7 @@ static void BM_ParagraphTextBigO(benchmark::State& state) {
text_style.font_families = std::vector<std::string>(1, "Roboto");
text_style.color = SK_ColorBLACK;

txt::ParagraphBuilderTxt builder(paragraph_style, GetTestFontCollection());
txt::ParagraphBuilderTxt builder(paragraph_style, font_collection_);

builder.PushStyle(text_style);
builder.AddText(u16_text);
Expand All @@ -193,12 +208,12 @@ static void BM_ParagraphTextBigO(benchmark::State& state) {
}
state.SetComplexityN(state.range(0));
}
BENCHMARK(BM_ParagraphTextBigO)
BENCHMARK_REGISTER_F(ParagraphFixture, TextBigO)
->RangeMultiplier(4)
->Range(1 << 6, 1 << 14)
->Complexity(benchmark::oN);

static void BM_ParagraphStylesBigO(benchmark::State& state) {
BENCHMARK_DEFINE_F(ParagraphFixture, StylesBigO)(benchmark::State& state) {
const char* text = "vry shrt ";
auto icu_text = icu::UnicodeString::fromUTF8(text);
std::u16string u16_text(icu_text.getBuffer(),
Expand All @@ -210,7 +225,7 @@ static void BM_ParagraphStylesBigO(benchmark::State& state) {
text_style.font_families = std::vector<std::string>(1, "Roboto");
text_style.color = SK_ColorBLACK;

txt::ParagraphBuilderTxt builder(paragraph_style, GetTestFontCollection());
txt::ParagraphBuilderTxt builder(paragraph_style, font_collection_);

for (int i = 0; i < state.range(0); ++i) {
builder.PushStyle(text_style);
Expand All @@ -223,12 +238,12 @@ static void BM_ParagraphStylesBigO(benchmark::State& state) {
}
state.SetComplexityN(state.range(0));
}
BENCHMARK(BM_ParagraphStylesBigO)
BENCHMARK_REGISTER_F(ParagraphFixture, StylesBigO)
->RangeMultiplier(4)
->Range(1 << 3, 1 << 12)
->Complexity(benchmark::oN);

static void BM_ParagraphPaintSimple(benchmark::State& state) {
BENCHMARK_F(ParagraphFixture, PaintSimple)(benchmark::State& state) {
const char* text = "Hello world! This is a simple sentence to test drawing.";
auto icu_text = icu::UnicodeString::fromUTF8(text);
std::u16string u16_text(icu_text.getBuffer(),
Expand All @@ -239,25 +254,20 @@ static void BM_ParagraphPaintSimple(benchmark::State& state) {
txt::TextStyle text_style;
text_style.font_families = std::vector<std::string>(1, "Roboto");
text_style.color = SK_ColorBLACK;
txt::ParagraphBuilderTxt builder(paragraph_style, GetTestFontCollection());
txt::ParagraphBuilderTxt builder(paragraph_style, font_collection_);
builder.PushStyle(text_style);
builder.AddText(u16_text);
auto paragraph = BuildParagraph(builder);
paragraph->Layout(300);

std::unique_ptr<SkBitmap> bitmap = std::make_unique<SkBitmap>();
bitmap->allocN32Pixels(1000, 1000);
std::unique_ptr<SkCanvas> canvas = std::make_unique<SkCanvas>(*bitmap);
canvas->clear(SK_ColorWHITE);
int offset = 0;
while (state.KeepRunning()) {
paragraph->Paint(canvas.get(), offset % 700, 10);
paragraph->Paint(canvas_.get(), offset % 700, 10);
offset++;
}
}
BENCHMARK(BM_ParagraphPaintSimple);

static void BM_ParagraphPaintLarge(benchmark::State& state) {
BENCHMARK_F(ParagraphFixture, PaintLarge)(benchmark::State& state) {
const char* text =
"Hello world! This is a simple sentence to test drawing. Hello world! "
"This is a simple sentence to test drawing. Hello world! This is a "
Expand Down Expand Up @@ -286,25 +296,20 @@ static void BM_ParagraphPaintLarge(benchmark::State& state) {
txt::TextStyle text_style;
text_style.font_families = std::vector<std::string>(1, "Roboto");
text_style.color = SK_ColorBLACK;
txt::ParagraphBuilderTxt builder(paragraph_style, GetTestFontCollection());
txt::ParagraphBuilderTxt builder(paragraph_style, font_collection_);
builder.PushStyle(text_style);
builder.AddText(u16_text);
auto paragraph = BuildParagraph(builder);
paragraph->Layout(300);

std::unique_ptr<SkBitmap> bitmap = std::make_unique<SkBitmap>();
bitmap->allocN32Pixels(1000, 1000);
std::unique_ptr<SkCanvas> canvas = std::make_unique<SkCanvas>(*bitmap);
canvas->clear(SK_ColorWHITE);
int offset = 0;
while (state.KeepRunning()) {
paragraph->Paint(canvas.get(), offset % 700, 10);
paragraph->Paint(canvas_.get(), offset % 700, 10);
offset++;
}
}
BENCHMARK(BM_ParagraphPaintLarge);

static void BM_ParagraphPaintDecoration(benchmark::State& state) {
BENCHMARK_F(ParagraphFixture, PaintDecoration)(benchmark::State& state) {
const char* text =
"Hello world! This is a simple sentence to test drawing. Hello world! "
"This is a simple sentence to test drawing.";
Expand All @@ -322,7 +327,7 @@ static void BM_ParagraphPaintDecoration(benchmark::State& state) {
text_style.decoration_style = TextDecorationStyle(kSolid);
text_style.color = SK_ColorBLACK;

txt::ParagraphBuilderTxt builder(paragraph_style, GetTestFontCollection());
txt::ParagraphBuilderTxt builder(paragraph_style, font_collection_);

builder.PushStyle(text_style);
builder.AddText(u16_text);
Expand All @@ -338,17 +343,12 @@ static void BM_ParagraphPaintDecoration(benchmark::State& state) {
auto paragraph = BuildParagraph(builder);
paragraph->Layout(300);

std::unique_ptr<SkBitmap> bitmap = std::make_unique<SkBitmap>();
bitmap->allocN32Pixels(1000, 1000);
std::unique_ptr<SkCanvas> canvas = std::make_unique<SkCanvas>(*bitmap);
canvas->clear(SK_ColorWHITE);
int offset = 0;
while (state.KeepRunning()) {
paragraph->Paint(canvas.get(), offset % 700, 10);
paragraph->Paint(canvas_.get(), offset % 700, 10);
offset++;
}
}
BENCHMARK(BM_ParagraphPaintDecoration);

// -----------------------------------------------------------------------------
//
Expand All @@ -357,7 +357,7 @@ BENCHMARK(BM_ParagraphPaintDecoration);
//
// -----------------------------------------------------------------------------

static void BM_ParagraphMinikinDoLayout(benchmark::State& state) {
BENCHMARK_DEFINE_F(ParagraphFixture, MinikinDoLayout)(benchmark::State& state) {
std::vector<uint16_t> text;
for (uint16_t i = 0; i < 16000 * 2; ++i) {
text.push_back(i % 5 == 0 ? ' ' : i);
Expand All @@ -372,9 +372,8 @@ static void BM_ParagraphMinikinDoLayout(benchmark::State& state) {
paint.letterSpacing = text_style.letter_spacing;
paint.wordSpacing = text_style.word_spacing;

auto collection =
GetTestFontCollection()->GetMinikinFontCollectionForFamilies(
text_style.font_families, "en-US");
auto collection = font_collection_->GetMinikinFontCollectionForFamilies(
text_style.font_families, "en-US");

while (state.KeepRunning()) {
minikin::Layout layout;
Expand All @@ -383,12 +382,12 @@ static void BM_ParagraphMinikinDoLayout(benchmark::State& state) {
}
state.SetComplexityN(state.range(0));
}
BENCHMARK(BM_ParagraphMinikinDoLayout)
BENCHMARK_REGISTER_F(ParagraphFixture, MinikinDoLayout)
->RangeMultiplier(4)
->Range(1 << 7, 1 << 14)
->Complexity(benchmark::oN);

static void BM_ParagraphMinikinAddStyleRun(benchmark::State& state) {
BENCHMARK_DEFINE_F(ParagraphFixture, AddStyleRun)(benchmark::State& state) {
std::vector<uint16_t> text;
for (uint16_t i = 0; i < 16000 * 2; ++i) {
text.push_back(i % 5 == 0 ? ' ' : i);
Expand All @@ -403,8 +402,6 @@ static void BM_ParagraphMinikinAddStyleRun(benchmark::State& state) {
paint.letterSpacing = text_style.letter_spacing;
paint.wordSpacing = text_style.word_spacing;

auto font_collection = GetTestFontCollection();

minikin::LineBreaker breaker;
breaker.setLocale(icu::Locale(), nullptr);
breaker.resize(text.size());
Expand All @@ -414,20 +411,20 @@ static void BM_ParagraphMinikinAddStyleRun(benchmark::State& state) {
while (state.KeepRunning()) {
for (int i = 0; i < 20; ++i) {
breaker.addStyleRun(&paint,
font_collection->GetMinikinFontCollectionForFamilies(
font_collection_->GetMinikinFontCollectionForFamilies(
std::vector<std::string>(1, "Roboto"), "en-US"),
font, state.range(0) / 20 * i,
state.range(0) / 20 * (i + 1), false);
}
}
state.SetComplexityN(state.range(0));
}
BENCHMARK(BM_ParagraphMinikinAddStyleRun)
BENCHMARK_REGISTER_F(ParagraphFixture, AddStyleRun)
->RangeMultiplier(4)
->Range(1 << 7, 1 << 14)
->Complexity(benchmark::oN);

static void BM_ParagraphSkTextBlobAlloc(benchmark::State& state) {
BENCHMARK_DEFINE_F(ParagraphFixture, SkTextBlobAlloc)(benchmark::State& state) {
SkFont font;
font.setEdging(SkFont::Edging::kAntiAlias);
font.setSize(14);
Expand All @@ -439,7 +436,7 @@ static void BM_ParagraphSkTextBlobAlloc(benchmark::State& state) {
}
state.SetComplexityN(state.range(0));
}
BENCHMARK(BM_ParagraphSkTextBlobAlloc)
BENCHMARK_REGISTER_F(ParagraphFixture, SkTextBlobAlloc)
->RangeMultiplier(4)
->Range(1 << 7, 1 << 14)
->Complexity(benchmark::oN);
Expand Down