Index: bench/MemoryBench.cpp |
diff --git a/bench/MemoryBench.cpp b/bench/MemoryBench.cpp |
index 6e8e4a8588af45e8c1191794eb74ae24a6281af5..418e149f80bdd801cdc7a51f2c0b081e6113d6f9 100644 |
--- a/bench/MemoryBench.cpp |
+++ b/bench/MemoryBench.cpp |
@@ -52,3 +52,108 @@ private: |
DEF_BENCH( return new ChunkAllocBench(64); ) |
DEF_BENCH( return new ChunkAllocBench(8*1024); ) |
+ |
+static int* calloc(size_t num) { |
+ return (int*)sk_calloc_throw(num*sizeof(int)); |
+} |
+ |
+static int* malloc_bzero(size_t num) { |
+ const size_t bytes = num*sizeof(int); |
+ int* ints = (int*)sk_malloc_throw(bytes); |
+ sk_bzero(ints, bytes); |
+ return ints; |
+} |
+ |
+class ZerosBench : public SkBenchmark { |
+ size_t fNum; |
+ bool fRead; |
+ bool fWrite; |
+ bool fUseCalloc; |
+ SkString fName; |
+public: |
+ ZerosBench(size_t num, bool read, bool write, bool useCalloc) |
+ : fNum(num) |
+ , fRead(read) |
+ , fWrite(write) |
+ , fUseCalloc(useCalloc) { |
+ fName.printf("memory_%s", useCalloc ? "calloc" : "malloc_bzero"); |
+ if (read && write) { |
+ fName.appendf("_rw"); |
+ } else if (read) { |
+ fName.appendf("_r"); |
+ } else if (write) { |
+ fName.appendf("_w"); |
+ } |
+ fName.appendf("_"SK_SIZE_T_SPECIFIER, num); |
+ fIsRendering = false; |
+ } |
+ |
+protected: |
+ virtual const char* onGetName() SK_OVERRIDE { |
+ return fName.c_str(); |
+ } |
+ |
+ virtual void onDraw(SkCanvas*) SK_OVERRIDE { |
+ for (int i = 0; i < this->getLoops(); i++) { |
+ int* zeros = fUseCalloc ? calloc(fNum) : malloc_bzero(fNum); |
+ if (fRead) { |
+ volatile int x = 15; |
+ for (size_t j = 0; j < fNum; j++) { |
+ x ^= zeros[j]; |
+ } |
+ } |
+ if (fWrite) { |
+ for (size_t j = 0; j < fNum; j++) { |
+ zeros[j] = 15; |
+ } |
+ } |
+ sk_free(zeros); |
+ } |
+ } |
+}; |
+ |
+// zero count r w useCalloc? |
+DEF_BENCH(return new ZerosBench(1024*1024, 0, 0, 0)) |
+DEF_BENCH(return new ZerosBench(1024*1024, 0, 0, 1)) |
+DEF_BENCH(return new ZerosBench(1024*1024, 0, 1, 0)) |
+DEF_BENCH(return new ZerosBench(1024*1024, 0, 1, 1)) |
+DEF_BENCH(return new ZerosBench(1024*1024, 1, 0, 0)) |
+DEF_BENCH(return new ZerosBench(1024*1024, 1, 0, 1)) |
+DEF_BENCH(return new ZerosBench(1024*1024, 1, 1, 0)) |
+DEF_BENCH(return new ZerosBench(1024*1024, 1, 1, 1)) |
+ |
+DEF_BENCH(return new ZerosBench(256*1024, 0, 0, 0)) |
+DEF_BENCH(return new ZerosBench(256*1024, 0, 0, 1)) |
+DEF_BENCH(return new ZerosBench(256*1024, 0, 1, 0)) |
+DEF_BENCH(return new ZerosBench(256*1024, 0, 1, 1)) |
+DEF_BENCH(return new ZerosBench(256*1024, 1, 0, 0)) |
+DEF_BENCH(return new ZerosBench(256*1024, 1, 0, 1)) |
+DEF_BENCH(return new ZerosBench(256*1024, 1, 1, 0)) |
+DEF_BENCH(return new ZerosBench(256*1024, 1, 1, 1)) |
+ |
+DEF_BENCH(return new ZerosBench(4*1024, 0, 0, 0)) |
+DEF_BENCH(return new ZerosBench(4*1024, 0, 0, 1)) |
+DEF_BENCH(return new ZerosBench(4*1024, 0, 1, 0)) |
+DEF_BENCH(return new ZerosBench(4*1024, 0, 1, 1)) |
+DEF_BENCH(return new ZerosBench(4*1024, 1, 0, 0)) |
+DEF_BENCH(return new ZerosBench(4*1024, 1, 0, 1)) |
+DEF_BENCH(return new ZerosBench(4*1024, 1, 1, 0)) |
+DEF_BENCH(return new ZerosBench(4*1024, 1, 1, 1)) |
+ |
+DEF_BENCH(return new ZerosBench(300, 0, 0, 0)) |
+DEF_BENCH(return new ZerosBench(300, 0, 0, 1)) |
+DEF_BENCH(return new ZerosBench(300, 0, 1, 0)) |
+DEF_BENCH(return new ZerosBench(300, 0, 1, 1)) |
+DEF_BENCH(return new ZerosBench(300, 1, 0, 0)) |
+DEF_BENCH(return new ZerosBench(300, 1, 0, 1)) |
+DEF_BENCH(return new ZerosBench(300, 1, 1, 0)) |
+DEF_BENCH(return new ZerosBench(300, 1, 1, 1)) |
+ |
+DEF_BENCH(return new ZerosBench(4, 0, 0, 0)) |
+DEF_BENCH(return new ZerosBench(4, 0, 0, 1)) |
+DEF_BENCH(return new ZerosBench(4, 0, 1, 0)) |
+DEF_BENCH(return new ZerosBench(4, 0, 1, 1)) |
+DEF_BENCH(return new ZerosBench(4, 1, 0, 0)) |
+DEF_BENCH(return new ZerosBench(4, 1, 0, 1)) |
+DEF_BENCH(return new ZerosBench(4, 1, 1, 0)) |
+DEF_BENCH(return new ZerosBench(4, 1, 1, 1)) |