public void FieldAccessorPerformanceTest() { int loopCount = 100; ErrorProneAbstracted instance = new ErrorProneAbstracted(); System.Reflection.FieldInfo fi = typeof(ErrorProneAbstracted).GetField("Id"); ShareDeployed.Proxy.FastReflection.FastField ff = new Proxy.FastReflection.FastField(fi); ShareDeployed.Proxy.FastReflection.FastField<ErrorProneAbstracted> ff2 = new Proxy.FastReflection.FastField<ErrorProneAbstracted>(fi); ShareDeployed.Proxy.FastReflection.FastField<ErrorProneAbstracted, int> ff3 = new Proxy.FastReflection.FastField<ErrorProneAbstracted, int>(fi); var dynField = ShareDeployed.Proxy.FastReflection.DynamicField.Create(fi); Stopwatch sw = new Stopwatch(); sw.Start(); int id = 0; for (int i = 1; i <= loopCount; i++) { fi.SetValue(instance, 12); id = (int)fi.GetValue(instance); } sw.Stop(); long reflTime = sw.ElapsedMilliseconds; sw.Reset(); sw.Start(); for (int i = 1; i <= loopCount; i++) { ff.Set(instance, i); id = (int)ff.Get(instance); } sw.Stop(); long fastFieldTime = sw.ElapsedMilliseconds; sw.Reset(); sw.Start(); for (int i = 1; i <= loopCount; i++) { ff2.Set(instance, i); id = (int)ff2.Get(instance); } sw.Stop(); long fastFieldTime2 = sw.ElapsedMilliseconds; sw.Reset(); sw.Start(); for (int i = 1; i <= loopCount; i++) { ff3.Set(instance, i); id = ff3.Get(instance); } sw.Stop(); long fastFieldTime3 = sw.ElapsedMilliseconds; sw.Reset(); sw.Start(); for (int i = 1; i <= loopCount; i++) { dynField.SetValue(instance, 12); id = (int)dynField.GetValue(instance); } sw.Stop(); long dynFieldTime = sw.ElapsedMilliseconds; Debug.WriteLine(string.Format("Difference is:{0},{1},{2},{3},{4}", reflTime, fastFieldTime, fastFieldTime2, fastFieldTime3, dynFieldTime)); Assert.IsTrue(fastFieldTime3 < fastFieldTime2 && fastFieldTime2 < fastFieldTime); Assert.IsTrue(dynFieldTime < reflTime && fastFieldTime < reflTime); }
public void FastFieldGetSetTest() { ErrorProneAbstracted objInstance = new ErrorProneAbstracted(); System.Reflection.FieldInfo fi = objInstance.GetType().GetField("Id"); Proxy.FastReflection.FastField ff = new Proxy.FastReflection.FastField(fi); Proxy.FastReflection.FastField<ErrorProneAbstracted, int> ff3 = new Proxy.FastReflection.FastField<ErrorProneAbstracted, int>(fi); var dynField = Proxy.FastReflection.DynamicField.Create(fi); int id = -1; Stopwatch sw = new Stopwatch(); sw.Start(); ff.Set(objInstance, 12); id = (int)ff.Get(objInstance); sw.Stop(); long fastElapsed = sw.ElapsedTicks; Assert.IsTrue(id == 12); sw.Reset(); sw.Start(); fi.SetValue(objInstance, 13); id = (int)fi.GetValue(objInstance); sw.Stop(); long reflectElapsed = sw.ElapsedTicks; Assert.IsTrue(id == 13); sw.Reset(); sw.Start(); dynField.SetValue(objInstance, 134); id = (int)dynField.GetValue(objInstance); sw.Stop(); long dynElapsed = sw.ElapsedTicks; Assert.IsTrue(id == 134); sw.Reset(); sw.Start(); ff3.Set(objInstance, 17); id = ff3.Get(objInstance); sw.Stop(); long fastGenElapsed = sw.ElapsedTicks; Assert.IsTrue(id == 17); Debug.WriteLine("FastField {0},FastField generic {1}, Reflection {2}, DynamicField {3}", fastElapsed, fastGenElapsed, reflectElapsed, dynElapsed); Assert.IsTrue(reflectElapsed > fastElapsed); }