From 975ae5e4b881d4df41fd06453a650d6312127c8d Mon Sep 17 00:00:00 2001 From: mtklein Date: Thu, 13 Nov 2014 13:55:22 -0800 Subject: Cap SkVarAlloc's desired block at 64K. This means we can store fLgMinSize in 4 bits (TBD). Local perf comparison calls this harmless-to-slightly-helpful. Nothing to get excited about, but seems to certainly not harm perf. BUG=skia: Review URL: https://codereview.chromium.org/722293003 --- src/core/SkVarAlloc.cpp | 13 +++++++++++-- src/core/SkVarAlloc.h | 2 +- 2 files changed, 12 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/core/SkVarAlloc.cpp b/src/core/SkVarAlloc.cpp index cc1fc1c734..6f5b5a18d3 100644 --- a/src/core/SkVarAlloc.cpp +++ b/src/core/SkVarAlloc.cpp @@ -7,6 +7,11 @@ #include #endif +enum { + kMinLgSize = 4, // The smallest block we'd ever want to allocate is 16B, + kMaxLgSize = 16, // and we see no benefit allocating blocks larger than 64K. +}; + struct SkVarAlloc::Block { Block* prev; char* data() { return (char*)(this + 1); } @@ -22,7 +27,7 @@ struct SkVarAlloc::Block { SkVarAlloc::SkVarAlloc() : fByte(NULL) , fRemaining(0) - , fLgMinSize(4) + , fLgSize(kMinLgSize) , fBlock(NULL) {} SkVarAlloc::~SkVarAlloc() { @@ -37,7 +42,7 @@ SkVarAlloc::~SkVarAlloc() { void SkVarAlloc::makeSpace(size_t bytes, unsigned flags) { SkASSERT(SkIsAlignPtr(bytes)); - size_t alloc = 1<<(fLgMinSize++); + size_t alloc = 1<data(); fRemaining = alloc - sizeof(Block); + if (fLgSize < kMaxLgSize) { + fLgSize++; + } + #if defined(SK_BUILD_FOR_MAC) SkASSERT(alloc == malloc_good_size(alloc)); #elif defined(SK_BUILD_FOR_LINUX) diff --git a/src/core/SkVarAlloc.h b/src/core/SkVarAlloc.h index 19b2d75e76..2b5401b7f0 100644 --- a/src/core/SkVarAlloc.h +++ b/src/core/SkVarAlloc.h @@ -28,7 +28,7 @@ private: char* fByte; unsigned fRemaining; - unsigned fLgMinSize; + unsigned fLgSize; // This is always in the range [4, 16], so it really only needs 4 bits. struct Block; Block* fBlock; -- cgit v1.2.3