Skip to content

Instantly share code, notes, and snippets.

@mattwarren
Last active August 26, 2016 15:08
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mattwarren/c9a87c40301f12084d0ab9ba43c01908 to your computer and use it in GitHub Desktop.
Save mattwarren/c9a87c40301f12084d0ab9ba43c01908 to your computer and use it in GitHub Desktop.
static void TestTryStartNoGCRegion(long sizeInBytes, bool preventGC, bool overAllocate = false)
{
Console.WriteLine("Prevent GC: {0}, Over Allocate: {1}", preventGC, overAllocate);
try
{
bool succeeded = false;
if (preventGC)
{
succeeded = GC.TryStartNoGCRegion(sizeInBytes); //, disallowFullBlockingGC: true);
Console.WriteLine("TryStartNoGCRegion: Size={0:N0} MB ({1:N0} K or {2:N0} bytes) {3}",
sizeInBytes / 1024.0 / 1024.0, sizeInBytes / 1024.0, sizeInBytes,
succeeded ? "SUCCEEDED" : "FAILED");
}
// TryStartNoGCRegion() causes a GC Collection, so call this once it's completed
var gcBefore = new GCInfo();
if (!preventGC || succeeded)
{
long allocated = 0;
var numRuns = 5;
var sizePerRun = sizeInBytes / numRuns;
if (overAllocate)
numRuns += 5;
var lastGC = new GCInfo();
for (int i = 0; i < numRuns; i++)
{
var test = new byte[sizePerRun];
allocated += (test.Length);
var currentGC = new GCInfo();
var totalMemory = GC.GetTotalMemory(forceFullCollection: false);
var gcOccured = (currentGC.Gen0 > lastGC.Gen0 || currentGC.Gen1 > lastGC.Gen1 || currentGC.Gen2 > lastGC.Gen2);
Console.WriteLine("Allocated: {0,6:N2} MB, Mode: {1,12}, Gen0: {2}, Gen1: {3}, Gen2: {4}, {5}",
allocated / 1024.0 / 1024.0,
GCSettings.LatencyMode,
currentGC.Gen0 - gcBefore.Gen0,
currentGC.Gen1 - gcBefore.Gen1,
currentGC.Gen2 - gcBefore.Gen2,
gcOccured ? "**" : "");
lastGC = currentGC;
}
if (GCSettings.LatencyMode == GCLatencyMode.NoGCRegion)
GC.EndNoGCRegion();
}
}
catch (ArgumentOutOfRangeException argEx)
{
// totalSize exceeds the ephemeral segment size.
Console.WriteLine("{0:N0} MB ({1:N0} K or {2:N0} bytes) - {3}",
sizeInBytes / 1024.0 / 1024.0, sizeInBytes / 1024.0, sizeInBytes, argEx.Message);
}
catch (Exception ex)
{
Console.WriteLine("{0:N0} MB ({1:N0} K or {2:N0} bytes) - {3} {4}",
sizeInBytes / 1024.0 / 1024.0, sizeInBytes / 1024.0, sizeInBytes, ex.GetType().Name, ex.Message);
}
Console.WriteLine();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment