using System; using System.Diagnostics; using System.IO; namespace TestingApplication { class Program { static StreamWriter _streamWriter = new StreamWriter("bench.txt"); private const int _numberOfIterationPerTest = 1000000000; private const int _numberOfTestExecutions = 10; static void Main(string[] args) { // With Strings //ObjCreationAndAccessInLoopWithStrings(); //AccessOnlyInLoopWithStrings(); //ObjCreationOnlyInLoopWithStrings(); // With POCO ObjCreationAndAccessInLoop(); AccessOnlyInLoop(); ObjCreationOnlyInLoop(); _streamWriter.Close(); } private static void ObjCreationOnlyInLoop() { _streamWriter.WriteLine(); _streamWriter.WriteLine("obj creation in loop, no access at all:"); for (int j = 0; j < _numberOfTestExecutions; j++) { Poco objPoco = new Poco(); Stopwatch watch = new Stopwatch(); watch.Start(); for (int i = 0; i < _numberOfIterationPerTest; i++) { ReadOnlyField objReadOnlyField = new ReadOnlyField(objPoco); } watch.Stop(); _streamWriter.Write(watch.ElapsedMilliseconds + ";"); watch.Reset(); watch.Start(); for (int i = 0; i < _numberOfIterationPerTest; i++) { ReadWriteField objReadWriteField = new ReadWriteField(objPoco); } watch.Stop(); _streamWriter.WriteLine(watch.ElapsedMilliseconds); } } private static void ObjCreationOnlyInLoopWithStrings() { _streamWriter.WriteLine(); _streamWriter.WriteLine("Strings -- obj creation in loop, no access at all:"); for (int j = 0; j < _numberOfTestExecutions; j++) { Stopwatch watch = new Stopwatch(); watch.Start(); for (int i = 0; i < _numberOfIterationPerTest; i++) { ReadOnlyField objReadOnlyField = new ReadOnlyField("I'm in class ReadOnlyField"); } watch.Stop(); _streamWriter.Write(watch.ElapsedMilliseconds + ";"); watch.Reset(); watch.Start(); for (int i = 0; i < _numberOfIterationPerTest; i++) { ReadWriteField objReadWriteField = new ReadWriteField("I'm in class ReadWriteField"); } watch.Stop(); _streamWriter.WriteLine(watch.ElapsedMilliseconds); } } private static void AccessOnlyInLoop() { _streamWriter.WriteLine(); _streamWriter.WriteLine("access in loop, obj creation at beginning"); for (int j = 0; j < _numberOfTestExecutions; j++) { Poco objPoco = new Poco(); ReadOnlyField objReadOnlyField = new ReadOnlyField(objPoco); ReadWriteField objReadWriteField = new ReadWriteField(objPoco); Stopwatch watch = new Stopwatch(); watch.Start(); for (int i = 0; i < _numberOfIterationPerTest; i++) { Poco myCopyOfObjPoco = objReadOnlyField.ObjPoco; } watch.Stop(); _streamWriter.Write(watch.ElapsedMilliseconds + ";"); watch.Reset(); watch.Start(); for (int i = 0; i < _numberOfIterationPerTest; i++) { Poco myCopyOfObjPoco = objReadWriteField.ObjPoco; } watch.Stop(); _streamWriter.WriteLine(watch.ElapsedMilliseconds); } } private static void AccessOnlyInLoopWithStrings() { _streamWriter.WriteLine(); _streamWriter.WriteLine("Strings -- access in loop, obj creation at beginning"); ReadOnlyField objReadOnlyField = new ReadOnlyField("I'm in class ReadOnlyField"); ReadWriteField objReadWriteField = new ReadWriteField("I'm in class ReadWriteField"); for (int j = 0; j < _numberOfTestExecutions; j++) { Stopwatch watch = new Stopwatch(); watch.Start(); for (int i = 0; i < _numberOfIterationPerTest; i++) { string test = objReadOnlyField.Message; } watch.Stop(); _streamWriter.Write(watch.ElapsedMilliseconds + ";"); watch.Reset(); watch.Start(); for (int i = 0; i < _numberOfIterationPerTest; i++) { string test = objReadWriteField.Message; } watch.Stop(); _streamWriter.WriteLine(watch.ElapsedMilliseconds); } } private static void ObjCreationAndAccessInLoop() { _streamWriter.WriteLine(); _streamWriter.WriteLine("Obj creation & access in loop"); for (int j = 0; j < _numberOfTestExecutions; j++) { Poco objPoco = new Poco(); Stopwatch watch = new Stopwatch(); watch.Start(); for (int i = 0; i < _numberOfIterationPerTest; i++) { ReadOnlyField objReadOnlyField = new ReadOnlyField(objPoco); Poco myCopyOfObjPoco = objReadOnlyField.ObjPoco; } watch.Stop(); _streamWriter.Write(watch.ElapsedMilliseconds + ";"); watch.Reset(); watch.Start(); for (int i = 0; i < _numberOfIterationPerTest; i++) { ReadWriteField objReadWriteField = new ReadWriteField(objPoco); Poco myCopyOfObjPoco = objReadWriteField.ObjPoco; } watch.Stop(); _streamWriter.WriteLine(watch.ElapsedMilliseconds); } } private static void ObjCreationAndAccessInLoopWithStrings() { _streamWriter.WriteLine(); _streamWriter.WriteLine("Strings -- Obj creation & access in loop"); for (int j = 0; j < _numberOfTestExecutions; j++) { Stopwatch watch = new Stopwatch(); watch.Start(); for (int i = 0; i < _numberOfIterationPerTest; i++) { ReadOnlyField objReadOnlyField = new ReadOnlyField("I'm in class ReadOnlyField"); string test = objReadOnlyField.Message; } watch.Stop(); _streamWriter.Write(watch.ElapsedMilliseconds + ";"); watch.Reset(); watch.Start(); for (int i = 0; i < _numberOfIterationPerTest; i++) { ReadWriteField objReadWriteField = new ReadWriteField("I'm in class ReadWriteField"); string test = objReadWriteField.Message; } watch.Stop(); _streamWriter.WriteLine(watch.ElapsedMilliseconds); } } } class ReadOnlyField { private readonly Poco _ObjPoco; private readonly string _message; public ReadOnlyField(Poco objPoco) { _ObjPoco = objPoco; } public ReadOnlyField(string message) { _message = message; } public Poco ObjPoco { get { return _ObjPoco; } } public string Message { get { return _message; } } } class ReadWriteField { private Poco _ObjPoco; private string _message; public ReadWriteField(Poco objPoco) { _ObjPoco = objPoco; } public ReadWriteField(string message) { _message = message; } public Poco ObjPoco { get { return _ObjPoco; } } public string Message { get { return _message; } } } class Poco { public string Message { get { return "I'm in obj Poco"; } } } }