SkWStream::writeText inlined.
Motivation: This function is used throughout SkPDF.
Note that the compiler can usually inline the result of strlen() for literal strings.
Before:
out/Release/nanobench -m WStreamWriteText -q
Timer overhead: 24.2ns
! -> high variance, ? -> moderate variance
micros bench
6.10 WStreamWriteText nonrendering
After:
out/Release/nanobench -m WStreamWriteText -q
Timer overhead: 23.9ns
! -> high variance, ? -> moderate variance
micros bench
2.51 WStreamWriteText nonrendering
PDF runtime change: -0.8% ±0.04%.
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1844343004
Review URL: https://codereview.chromium.org/1844343004
diff --git a/bench/PDFBench.cpp b/bench/PDFBench.cpp
index 9da745c..df6873c 100644
--- a/bench/PDFBench.cpp
+++ b/bench/PDFBench.cpp
@@ -17,6 +17,7 @@
#include "SkPDFUtils.h"
#include "SkPixmap.h"
#include "SkRandom.h"
+#include "SkStream.h"
namespace {
struct NullWStream : public SkWStream {
@@ -190,9 +191,26 @@
}
};
+struct WStreamWriteTextBenchmark : public Benchmark {
+ std::unique_ptr<SkWStream> fWStream;
+ WStreamWriteTextBenchmark() : fWStream(new NullWStream) {}
+ const char* onGetName() override { return "WStreamWriteText"; }
+ bool isSuitableFor(Backend backend) override {
+ return backend == kNonRendering_Backend;
+ }
+ void onDraw(int loops, SkCanvas*) override {
+ while (loops-- > 0) {
+ for (int i = 1000; i-- > 0;) {
+ fWStream->writeText("HELLO SKIA!\n");
+ }
+ }
+ }
+};
+
} // namespace
DEF_BENCH(return new PDFImageBench;)
DEF_BENCH(return new PDFJpegImageBench;)
DEF_BENCH(return new PDFCompressionBench;)
DEF_BENCH(return new PDFScalarBench;)
DEF_BENCH(return new PDFShaderBench;)
+DEF_BENCH(return new WStreamWriteTextBenchmark;)
diff --git a/include/core/SkStream.h b/include/core/SkStream.h
index a6a62c4..4bfaeda 100644
--- a/include/core/SkStream.h
+++ b/include/core/SkStream.h
@@ -200,7 +200,10 @@
bool write16(U16CPU);
bool write32(uint32_t);
- bool writeText(const char text[]);
+ bool writeText(const char text[]) {
+ SkASSERT(text);
+ return this->write(text, strlen(text));
+ }
bool writeDecAsText(int32_t);
bool writeBigDecAsText(int64_t, int minDigits = 0);
bool writeHexAsText(uint32_t, int minDigits = 0);
diff --git a/src/core/SkStream.cpp b/src/core/SkStream.cpp
index 1d1c9b9..6dbde4d 100644
--- a/src/core/SkStream.cpp
+++ b/src/core/SkStream.cpp
@@ -78,12 +78,6 @@
{
}
-bool SkWStream::writeText(const char text[])
-{
- SkASSERT(text);
- return this->write(text, strlen(text));
-}
-
bool SkWStream::writeDecAsText(int32_t dec)
{
char buffer[SkStrAppendS32_MaxSize];