change SkChunkAlloc to grow its allocations geometrically (not linearly)
plus add a bench and unittest for it.
git-svn-id: http://skia.googlecode.com/svn/trunk@3989 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/bench/MemoryBench.cpp b/bench/MemoryBench.cpp
new file mode 100644
index 0000000..e732687
--- /dev/null
+++ b/bench/MemoryBench.cpp
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2012 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "SkBenchmark.h"
+#include "SkCanvas.h"
+#include "SkPaint.h"
+#include "SkRandom.h"
+#include "SkChunkAlloc.h"
+#include "SkString.h"
+
+class ChunkAllocBench : public SkBenchmark {
+ SkString fName;
+ size_t fMinSize;
+
+ enum {
+ N = SkBENCHLOOP(1000)
+ };
+public:
+ ChunkAllocBench(void* param, size_t minSize) : INHERITED(param) {
+ fMinSize = minSize;
+ fName.printf("chunkalloc_%d", minSize);
+ }
+
+protected:
+ virtual const char* onGetName() SK_OVERRIDE {
+ return fName.c_str();
+ }
+
+ virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
+ size_t inc = fMinSize >> 4;
+ SkASSERT(inc > 0);
+ size_t total = fMinSize * 64;
+
+ SkChunkAlloc alloc(fMinSize);
+
+ for (int i = 0; i < N; ++i) {
+ size_t size = 0;
+ int calls = 0;
+ while (size < total) {
+ alloc.allocThrow(inc);
+ size += inc;
+ calls += 1;
+ }
+ alloc.reset();
+ }
+ }
+
+private:
+ typedef SkBenchmark INHERITED;
+};
+
+static SkBenchmark* F0(void* p) { return new ChunkAllocBench(p, 64); }
+static SkBenchmark* F1(void* p) { return new ChunkAllocBench(p, 8*1024); }
+
+static BenchRegistry gR0(F0);
+static BenchRegistry gR1(F1);
+