Tests: benchmark of linear allocator now compares to various allocation strategies.
diff --git a/src/Tests.cpp b/src/Tests.cpp
index a508fb0..c5cf05b 100644
--- a/src/Tests.cpp
+++ b/src/Tests.cpp
@@ -130,6 +130,33 @@
VmaAllocation Allocation = VK_NULL_HANDLE;
};
+static uint32_t GetAllocationStrategyCount()
+{
+ uint32_t strategyCount = 0;
+ switch(ConfigType)
+ {
+ case CONFIG_TYPE_MINIMUM: strategyCount = 1; break;
+ case CONFIG_TYPE_SMALL: strategyCount = 1; break;
+ case CONFIG_TYPE_AVERAGE: strategyCount = 2; break;
+ case CONFIG_TYPE_LARGE: strategyCount = 2; break;
+ case CONFIG_TYPE_MAXIMUM: strategyCount = 3; break;
+ default: assert(0);
+ }
+ return strategyCount;
+}
+
+static const char* GetAllocationStrategyName(VmaAllocationCreateFlags allocStrategy)
+{
+ switch(allocStrategy)
+ {
+ case VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT: return "BEST_FIT"; break;
+ case VMA_ALLOCATION_CREATE_STRATEGY_WORST_FIT_BIT: return "WORST_FIT"; break;
+ case VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT: return "FIRST_FIT"; break;
+ case 0: return "Default"; break;
+ default: assert(0); return "";
+ }
+}
+
static void InitResult(Result& outResult)
{
outResult.TotalTime = duration::zero();
@@ -2104,7 +2131,11 @@
vmaDestroyPool(g_hAllocator, pool);
}
-static void BenchmarkLinearAllocatorCase(FILE* file, bool linear, bool empty, FREE_ORDER freeOrder)
+static void BenchmarkLinearAllocatorCase(FILE* file,
+ bool linear,
+ bool empty,
+ VmaAllocationCreateFlags allocStrategy,
+ FREE_ORDER freeOrder)
{
RandomNumberGenerator rand{16223};
@@ -2145,6 +2176,7 @@
VmaAllocationCreateInfo allocCreateInfo = {};
allocCreateInfo.pool = pool;
+ allocCreateInfo.flags = allocStrategy;
VmaAllocation alloc;
std::vector<VmaAllocation> baseAllocations;
@@ -2226,9 +2258,10 @@
const float allocTotalSeconds = ToFloatSeconds(allocTotalDuration);
const float freeTotalSeconds = ToFloatSeconds(freeTotalDuration);
- printf(" LinearAlgorithm=%u %s FreeOrder=%s: allocations %g s, free %g s\n",
+ printf(" LinearAlgorithm=%u %s Allocation=%s FreeOrder=%s: allocations %g s, free %g s\n",
linear ? 1 : 0,
empty ? "Empty" : "Not empty",
+ GetAllocationStrategyName(allocStrategy),
FREE_ORDER_NAMES[(size_t)freeOrder],
allocTotalSeconds,
freeTotalSeconds);
@@ -2238,10 +2271,11 @@
std::string currTime;
CurrentTimeToStr(currTime);
- fprintf(file, "%s,%s,%u,%u,%s,%g,%g\n",
+ fprintf(file, "%s,%s,%u,%u,%s,%s,%g,%g\n",
CODE_DESCRIPTION, currTime.c_str(),
linear ? 1 : 0,
empty ? 1 : 0,
+ GetAllocationStrategyName(allocStrategy),
FREE_ORDER_NAMES[(uint32_t)freeOrder],
allocTotalSeconds,
freeTotalSeconds);
@@ -2256,7 +2290,7 @@
{
fprintf(file,
"Code,Time,"
- "Linear,Empty,Free order,"
+ "Linear,Empty,Allocation strategy,Free order,"
"Allocation time (s),Deallocation time (s)\n");
}
@@ -2267,6 +2301,7 @@
freeOrderCount = 2;
const uint32_t emptyCount = ConfigType >= CONFIG_TYPE::CONFIG_TYPE_SMALL ? 2 : 1;
+ const uint32_t allocStrategyCount = GetAllocationStrategyCount();
for(uint32_t freeOrderIndex = 0; freeOrderIndex < freeOrderCount; ++freeOrderIndex)
{
@@ -2283,11 +2318,30 @@
{
for(uint32_t linearIndex = 0; linearIndex < 2; ++linearIndex)
{
- BenchmarkLinearAllocatorCase(
- file,
- linearIndex ? 1 : 0, // linear
- emptyIndex ? 0 : 1, // empty
- freeOrder); // freeOrder
+ const bool linear = linearIndex ? 1 : 0;
+
+ uint32_t currAllocStrategyCount = linear ? 1 : allocStrategyCount;
+ for(uint32_t allocStrategyIndex = 0; allocStrategyIndex < currAllocStrategyCount; ++allocStrategyIndex)
+ {
+ VmaAllocatorCreateFlags strategy = 0;
+ if(!linear)
+ {
+ switch(allocStrategyIndex)
+ {
+ case 0: strategy = VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT; break;
+ case 1: strategy = VMA_ALLOCATION_CREATE_STRATEGY_WORST_FIT_BIT; break;
+ case 2: strategy = VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT; break;
+ default: assert(0);
+ }
+ }
+
+ BenchmarkLinearAllocatorCase(
+ file,
+ linear, // linear
+ emptyIndex ? 0 : 1, // empty
+ strategy,
+ freeOrder); // freeOrder
+ }
}
}
}
@@ -3555,16 +3609,7 @@
default: assert(0);
}
- size_t strategyCount = 0;
- switch(ConfigType)
- {
- case CONFIG_TYPE_MINIMUM: strategyCount = 1; break;
- case CONFIG_TYPE_SMALL: strategyCount = 1; break;
- case CONFIG_TYPE_AVERAGE: strategyCount = 2; break;
- case CONFIG_TYPE_LARGE: strategyCount = 2; break;
- case CONFIG_TYPE_MAXIMUM: strategyCount = 3; break;
- default: assert(0);
- }
+ const size_t strategyCount = GetAllocationStrategyCount();
for(size_t threadCountIndex = 0; threadCountIndex < threadCountCount; ++threadCountIndex)
{
@@ -4041,6 +4086,8 @@
if(false)
{
// # Temporarily insert custom tests here
+ // ########################################
+ // ########################################
return;
}