You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ibatis.apache.org by rg...@apache.org on 2006/03/12 22:41:25 UTC

svn commit: r385370 - /ibatis/trunk/cs/mapper/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/PropertyAccessorTest.cs

Author: rgrabowski
Date: Sun Mar 12 13:41:24 2006
New Revision: 385370

URL: http://svn.apache.org/viewcvs?rev=385370&view=rev
Log:
Added IBatisNet.Common.Utilities.Objects.ReflectionInfo and System.Reflection.PropertyInfo to performance test cases for property access.

Modified:
    ibatis/trunk/cs/mapper/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/PropertyAccessorTest.cs

Modified: ibatis/trunk/cs/mapper/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/PropertyAccessorTest.cs
URL: http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/PropertyAccessorTest.cs?rev=385370&r1=385369&r2=385370&view=diff
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/PropertyAccessorTest.cs (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/PropertyAccessorTest.cs Sun Mar 12 13:41:24 2006
@@ -40,10 +40,20 @@
         	Account account = new Account();
             int test = -1;
 
-            // IL Property accessor
-        	IPropertyAccessor propertyAccessor = ILPropertyAccessor.CreatePropertyAccessor(typeof(Account), "Id");
-
+			#region Direct access (fastest)
 			long time = DateTime.Now.Ticks;
+			for (int i = 0; i < TEST_ITERATIONS; i++)
+			{
+				test = -1;
+				test = account.Id;
+				Assert.AreEqual(0, test);
+			}
+			long directAccessMs = DateTime.Now.Ticks - time;
+			#endregion
+
+			#region IL Property accessor
+        	IPropertyAccessor propertyAccessor = ILPropertyAccessor.CreatePropertyAccessor(typeof(Account), "Id");
+			time = DateTime.Now.Ticks;
             for (int i = 0; i < TEST_ITERATIONS; i++)
             {
                 test = -1;
@@ -51,38 +61,60 @@
                 Assert.AreEqual(0, test);
             }
             long propertyAccessorMs = DateTime.Now.Ticks - time;
+			float propertyAccessorRatio = (float)propertyAccessorMs / directAccessMs;
+			#endregion
 
-            // Direct access
-            time = DateTime.Now.Ticks;
-            for (int i = 0; i < TEST_ITERATIONS; i++)
-            {
-                test = -1;
-                test = account.Id;
-                Assert.AreEqual(0, test);
-            }
-            long directAccessMs = DateTime.Now.Ticks - time;
-
-            // Reflection
-            Type type = account.GetType();
-            time = DateTime.Now.Ticks;
-            for (int i = 0; i < TEST_ITERATIONS; i++)
-            {
-                test = -1;
-                test = (int)type.InvokeMember("Id",
-                                              BindingFlags.Public | BindingFlags.GetProperty | BindingFlags.Instance,
-                    null, account, null);
-                Assert.AreEqual(0, test);
-            }
-            long reflectionMs = DateTime.Now.Ticks - time;
-
-            // Print results
-            Console.WriteLine(
-                TEST_ITERATIONS.ToString() + " property gets on integer..."
-                + "\nDirect access : \t\t" + directAccessMs.ToString() + " ms"
-                + "\nIPropertyAccessor : \t\t" + propertyAccessorMs.ToString()+ " ms Ratio: " + (((float)propertyAccessorMs / directAccessMs)).ToString()
-                + "\nReflection : \t\t\t" + reflectionMs.ToString() + " ms Ratio: " + (((float)reflectionMs / directAccessMs)).ToString());
+			#region IBatisNet.Common.Utilities.Object.ReflectionInfo
+			ReflectionInfo reflectionInfo = ReflectionInfo.GetInstance(account.GetType());
+			time = DateTime.Now.Ticks;
+			for (int i = 0; i < TEST_ITERATIONS; i++)
+			{
+				test = -1;
+				PropertyInfo propertyInfo = reflectionInfo.GetGetter("Id");
+				test = (int)propertyInfo.GetValue(account, null);
+				Assert.AreEqual(0, test);
+			}
+			long reflectionInfoMs = DateTime.Now.Ticks - time;
+			float reflectionInfoRatio = (float)reflectionInfoMs / directAccessMs;
+			#endregion
+
+			#region Reflection
+			Type type = account.GetType();
+			time = DateTime.Now.Ticks;
+			for (int i = 0; i < TEST_ITERATIONS; i++)
+			{
+				test = -1;
+				PropertyInfo propertyInfo = type.GetProperty("Id", BindingFlags.Public | BindingFlags.SetProperty | BindingFlags.Instance);
+				test = (int)propertyInfo.GetValue(account, null);
+				Assert.AreEqual(0, test);
+			}
+			long reflectionMs = DateTime.Now.Ticks - time;
+			float reflectionRatio = (float)reflectionMs / directAccessMs;
+			#endregion
+
+			#region ReflectionInvokeMember (slowest)
+			type = account.GetType();
+			time = DateTime.Now.Ticks;
+			for (int i = 0; i < TEST_ITERATIONS; i++)
+			{
+				test = -1;
+				test = (int)type.InvokeMember("Id",
+					BindingFlags.Public | BindingFlags.GetProperty | BindingFlags.Instance,
+					null, account, null);
+				Assert.AreEqual(0, test);
+			}
+			long reflectionInvokeMemberMs = DateTime.Now.Ticks - time;
+			float reflectionInvokeMemberRatio = (float)reflectionInvokeMemberMs / directAccessMs;
+			#endregion
+
+			// Print results
+			Console.WriteLine("{0} property gets on integer...", TEST_ITERATIONS);
+			Console.WriteLine("Direct access: \t\t{0} ms", directAccessMs);
+			Console.WriteLine("IPropertyAccessor: \t\t{0} ms Ratio: {1}", propertyAccessorMs, propertyAccessorRatio);
+			Console.WriteLine("IBatisNet ReflectionInfo: \t{0} ms Ratio: {1}", reflectionInfoMs, reflectionInfoRatio);
+			Console.WriteLine("ReflectionInvokeMember: \t{0} ms Ratio: {1}", reflectionInvokeMemberMs, reflectionInvokeMemberRatio);
+			Console.WriteLine("Reflection: \t\t\t{0} ms Ratio: {1}", reflectionMs, reflectionRatio);
         }
-
         
 		/// <summary>
         /// Test the performance of getting an integer property.
@@ -94,25 +126,53 @@
             Account account = new Account();
             int value = 123;
 
-            // Property accessor
+			#region Direct access (fastest)
+			long start = DateTime.Now.Ticks;
+			for (int i = 0; i < TEST_ITERATIONS; i++)
+			{
+				account.Id = value;
+			}
+			long directAccessMs = DateTime.Now.Ticks - start;
+			#endregion
+
+			#region Property accessor
             IPropertyAccessor propertyAccessor = ILPropertyAccessor.CreatePropertyAccessor(typeof(Account), "Id");
-            long start = DateTime.Now.Ticks;
+            start = DateTime.Now.Ticks;
             for (int i = 0; i < TEST_ITERATIONS; i++)
             {
                 propertyAccessor.Set(account, value);
             }
             long propertyAccessorMs = DateTime.Now.Ticks - start;
+			float propertyAccessorRatio = (float)propertyAccessorMs / directAccessMs;
+			#endregion
 
-            // Direct access
-            start = DateTime.Now.Ticks;
-            for (int i = 0; i < TEST_ITERATIONS; i++)
-            {
-                account.Id = value;
-            }
-            long directAccessMs = DateTime.Now.Ticks - start;
+			#region IBatisNet.Common.Utilities.Object.ReflectionInfo
+			Type type = account.GetType();
+			ReflectionInfo reflectionInfo = ReflectionInfo.GetInstance(type);
+			start = DateTime.Now.Ticks;
+			for (int i = 0; i < TEST_ITERATIONS; i++)
+			{
+				PropertyInfo propertyInfo = reflectionInfo.GetSetter("Id");
+				propertyInfo.SetValue(account, value, null);
+			}
+			long reflectionInfoMs = DateTime.Now.Ticks - start;
+			float reflectionInfoRatio = (float)reflectionInfoMs / directAccessMs;
+			#endregion
+
+			#region Reflection
+			type = account.GetType();
+			start = DateTime.Now.Ticks;
+			for (int i = 0; i < TEST_ITERATIONS; i++)
+			{
+				PropertyInfo propertyInfo = type.GetProperty("Id", BindingFlags.Public | BindingFlags.SetProperty | BindingFlags.Instance);
+				propertyInfo.SetValue(account, value, null);
+			}
+			long reflectionMs = DateTime.Now.Ticks - start;
+			float reflectionRatio = (float)reflectionMs / directAccessMs;
+			#endregion
 
-            // Reflection
-            Type type = account.GetType();
+			#region ReflectionInvokeMember (slowest)
+            type = account.GetType();
             start = DateTime.Now.Ticks;
             for (int i = 0; i < TEST_ITERATIONS; i++)
             {
@@ -120,16 +180,18 @@
                     BindingFlags.Public | BindingFlags.SetProperty | BindingFlags.Instance,
                     null, account, new object[] { value });
             }
-            long reflectionMs = DateTime.Now.Ticks - start;
+            long reflectionInvokeMemberMs = DateTime.Now.Ticks - start;
+			float reflectionInvokeMemberRatio = (float)reflectionInvokeMemberMs / directAccessMs;
+			#endregion
             
-            // Print results
-            Console.WriteLine(
-                TEST_ITERATIONS.ToString() + " property sets on integer..."
-                + "\nDirect access : \t\t" + directAccessMs.ToString() + " ms"
-                + "\nPropertyAccessor : \t\t" + propertyAccessorMs.ToString() + " ms Ratio: " + (((float)propertyAccessorMs / directAccessMs)).ToString()
-                + "\nReflection : \t\t\t" +  reflectionMs +" ms Ratio: " + (((float)reflectionMs / directAccessMs)).ToString());
+			// Print results
+			Console.WriteLine("{0} property sets on integer...", TEST_ITERATIONS);
+			Console.WriteLine("Direct access: \t\t{0} ms", directAccessMs);
+			Console.WriteLine("IPropertyAccessor: \t\t{0} ms Ratio: {1}", propertyAccessorMs, propertyAccessorRatio);
+			Console.WriteLine("IBatisNet ReflectionInfo: \t{0} ms Ratio: {1}", reflectionInfoMs, reflectionInfoRatio);
+			Console.WriteLine("ReflectionInvokeMember: \t{0} ms Ratio: {1}", reflectionInvokeMemberMs, reflectionInvokeMemberRatio);
+			Console.WriteLine("Reflection: \t\t\t{0} ms Ratio: {1}", reflectionMs, reflectionRatio);
         }
-
        
 		/// <summary>
         /// Test the performance of getting an integer property.