From 519f9677a41239808f41a7c13ef1f6e05eb1ed50 Mon Sep 17 00:00:00 2001 From: "mtklein@google.com" Date: Fri, 20 Sep 2013 14:31:45 +0000 Subject: Add sk_calloc. Remove SkMemory_stdlib, which seems unused. I'm seeing basically no difference between malloc + bzero and calloc on my desktop, but on a Galaxy Nexus calloc is never slower, and significantly faster once the allocation size becomes large, both for allocation and for _reading_. BUG=skia:1662 R=reed@google.com Review URL: https://codereview.chromium.org/24251008 git-svn-id: http://skia.googlecode.com/svn/trunk@11414 2bbb7eff-a529-9590-31e7-b0007b416f81 --- bench/MemoryBench.cpp | 105 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) (limited to 'bench/MemoryBench.cpp') diff --git a/bench/MemoryBench.cpp b/bench/MemoryBench.cpp index 6e8e4a8588..418e149f80 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)) -- cgit v1.2.3