summaryrefslogtreecommitdiff
path: root/tests/src/GC/Performance/Tests/GCPerf.cs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/src/GC/Performance/Tests/GCPerf.cs')
-rw-r--r--tests/src/GC/Performance/Tests/GCPerf.cs74
1 files changed, 74 insertions, 0 deletions
diff --git a/tests/src/GC/Performance/Tests/GCPerf.cs b/tests/src/GC/Performance/Tests/GCPerf.cs
new file mode 100644
index 0000000000..b963b53622
--- /dev/null
+++ b/tests/src/GC/Performance/Tests/GCPerf.cs
@@ -0,0 +1,74 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+
+class Foo
+{
+ public Foo F1;
+ public Foo F2;
+ public Foo F3;
+ public Foo F4;
+ static int SizeOfFoo = 32;
+
+ static void Main(string[] args)
+ {
+ int mem = Int32.MaxValue / 2;
+ if( args.Length > 0 )
+ {
+ if ( !Int32.TryParse( args[0], out mem ) )
+ {
+ mem = Int32.MaxValue / 2;
+ }
+ }
+
+ int fooCnt = mem / SizeOfFoo;
+ Console.WriteLine( "Creating {0} objects of type 'Foo', each with a size of {1} bytes.", fooCnt, SizeOfFoo );
+
+ Foo[] currFoos = new Foo[ 4 ];
+ for( int i = 0; i < fooCnt; ++i )
+ {
+ Foo f = new Foo();
+ if( i < 4 )
+ {
+ currFoos[i] = f;
+ }
+ else
+ {
+ f.F1 = currFoos[0];
+ f.F2 = currFoos[1];
+ f.F3 = currFoos[2];
+ f.F4 = currFoos[3];
+
+ currFoos[0] = currFoos[1];
+ currFoos[1] = currFoos[2];
+ currFoos[2] = currFoos[3];
+ currFoos[3] = f;
+ }
+ }
+
+ Random randDel = new Random( 17 );
+ int delCnt = randDel.Next( 5, 100 );
+ Console.WriteLine( "Deleting {0} objects.", delCnt );
+
+ Foo currDelBlock = currFoos[0].F1;
+ Foo nextDelBlock = currFoos[0].F1;
+ for( int i = 0; i < delCnt; ++i )
+ {
+ for( int j = 0; j < 10; ++j )
+ {
+ nextDelBlock = nextDelBlock.F1;
+ }
+ for( int k = 0; k < 4; ++k )
+ {
+ currDelBlock.F1 = null;
+ currDelBlock.F2.F4 = null;
+ currDelBlock.F3.F3 = null;
+ currDelBlock.F4.F2 = null;
+ }
+ currDelBlock = nextDelBlock;
+ }
+ }
+}
+