Index: bench/Sk4fBench.cpp |
diff --git a/bench/Sk4fBench.cpp b/bench/Sk4fBench.cpp |
index 823e14c0af17a5f4cc7c63732caaee2007581ef6..d5201fa2f0a2292430454789562e57a4f1f7585a 100644 |
--- a/bench/Sk4fBench.cpp |
+++ b/bench/Sk4fBench.cpp |
@@ -9,16 +9,8 @@ |
#include "SkColor.h" |
#include "SkNx.h" |
-// Used to prevent the compiler from optimizing away the whole loop. |
-volatile uint64_t blackhole = 0; |
- |
-// Not a great random number generator, but it's very fast. |
-// The code we're measuring is quite fast, so low overhead is essential. |
-static uint64_t lcg_rand(uint64_t* seed) { |
- *seed *= 1664525; |
- *seed += 1013904223; |
- return *seed; |
-} |
+// Writing into this array prevents the loops from being compiled away. |
+static volatile float blackhole[4]; |
template <typename T> |
struct Sk4fRoundtripBench : public Benchmark { |
@@ -28,6 +20,7 @@ struct Sk4fRoundtripBench : public Benchmark { |
switch (sizeof(T)) { |
case 1: return "Sk4f_roundtrip_u8"; |
case 2: return "Sk4f_roundtrip_u16"; |
+ case 4: return "Sk4f_roundtrip_int"; |
} |
SkASSERT(false); |
return ""; |
@@ -36,21 +29,16 @@ struct Sk4fRoundtripBench : public Benchmark { |
bool isSuitableFor(Backend backend) override { return backend == kNonRendering_Backend; } |
void onDraw(int loops, SkCanvas* canvas) override { |
- // Unlike blackhole, junk can and probably will be a register. |
- uint64_t junk = 0; |
- uint64_t seed = 0; |
- for (int i = 0; i < loops; i++) { |
- uint64_t src = lcg_rand(&seed), |
- back; |
- auto f = SkNx_cast<float>(SkNx<4,T>::Load(&src)); |
- SkNx_cast<T>(f).store(&back); |
- junk ^= back; |
+ Sk4f fs(1,2,3,4); |
+ while (loops --> 0) { |
+ fs = SkNx_cast<float>(SkNx_cast<T>(fs)); |
} |
- blackhole ^= junk; |
+ fs.store((float*)blackhole); |
} |
}; |
DEF_BENCH(return new Sk4fRoundtripBench<uint8_t>;) |
DEF_BENCH(return new Sk4fRoundtripBench<uint16_t>;) |
+DEF_BENCH(return new Sk4fRoundtripBench<int>;) |
struct Sk4fGradientBench : public Benchmark { |
const char* onGetName() override { return "Sk4f_gradient"; } |