83 lines
3.1 KiB
C#
83 lines
3.1 KiB
C#
//-----------------------------------------------------------------------
|
|
// -----------------------------------------------------------------------
|
|
// file="SlabStressTest"
|
|
// Project: StgSharp
|
|
// AuthorGroup: Nitload
|
|
// Copyright (c) Nitload. All rights reserved.
|
|
//
|
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
// of this software and associated documentation files (the "Software"), to deal
|
|
// in the Software without restriction, including without limitation the rights
|
|
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
// copies of the Software, and to permit persons to whom the Software is
|
|
// furnished to do so, subject to the following conditions:
|
|
//
|
|
// The above copyright notice and this permission notice shall be included in all
|
|
// copies or substantial portions of the Software.
|
|
//
|
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
// SOFTWARE.
|
|
//
|
|
// -----------------------------------------------------------------------
|
|
// -----------------------------------------------------------------------
|
|
using StgSharp.HighPerformance.Memory;
|
|
using System;
|
|
using System.Diagnostics;
|
|
|
|
namespace StgSharp
|
|
{
|
|
internal static class SlabStressTest
|
|
{
|
|
|
|
// Exercise the Nonconcurrent Chunked SLAB used by HLSF (allocation/free only)
|
|
public static unsafe void Run()
|
|
{
|
|
Console.WriteLine("=== SLAB Allocator (Chunked) Single-Thread Stress Test ===");
|
|
|
|
// Use SLAB with element size of pointer (nuint) to simulate Entry handles
|
|
SlabAllocator<BunchOfBytes> slab = SlabAllocator<BunchOfBytes>.Create(64, SlabBufferLayout.Chunked, false);
|
|
|
|
int cycles = 10;
|
|
int allocsPerCycle = 200_000; // large enough to force internal growth
|
|
|
|
Stopwatch sw = new Stopwatch();
|
|
|
|
for (int c = 0; c < cycles; c++)
|
|
{
|
|
Console.WriteLine($"--- Cycle {c+1} ---");
|
|
nuint[] ptrs = new nuint[allocsPerCycle];
|
|
|
|
sw.Restart();
|
|
for (int i = 0; i < allocsPerCycle; i++) {
|
|
ptrs[i] = slab.Allocate();
|
|
}
|
|
sw.Stop();
|
|
Console.WriteLine($"Allocate: {allocsPerCycle} in {sw.Elapsed.TotalSeconds:0.00}s");
|
|
|
|
sw.Restart();
|
|
for (int i = 0; i < allocsPerCycle; i++) {
|
|
slab.Free(ptrs[i]);
|
|
}
|
|
sw.Stop();
|
|
Console.WriteLine($"Free: {allocsPerCycle} in {sw.Elapsed.TotalSeconds:0.00}s");
|
|
}
|
|
|
|
slab.Dispose();
|
|
Console.WriteLine("=== SLAB Stress Complete ===");
|
|
}
|
|
|
|
internal unsafe struct BunchOfBytes
|
|
{
|
|
|
|
public fixed byte Data[128];
|
|
|
|
}
|
|
|
|
}
|
|
}
|