using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Reflection; using System.Threading; namespace ConsoleApplication1 { class Program { private static AppendDelegate append; private static ExecuteNonQuery executeNonQuery; private static MethodInfo executeNonQueryInfo; private static MethodInfo appendInfo; private static object sqlCmdSet; private const BindingFlags bindingFlags = BindingFlags.NonPublic | BindingFlags.Instance; private static int iterations = 10; delegate void AppendDelegate(SqlCommand cmd); delegate int ExecuteNonQuery(); delegate void A(); static void Main() { for (int i = 1; i < 11; i++) { SqlConnection connection = new SqlConnection("Data Source=localhost;Initial Catalog=Test;Trusted_Connection=Yes"); iterations = 100*(i*10); Console.Write("I---{0}", iterations); RunTest(connection); connection.Open(); SqlCommand command = connection.CreateCommand(); command.CommandText = "truncate table blogs"; command.ExecuteNonQuery(); connection.Close(); Console.WriteLine(); } } class Foo { public void SleepMilliSecond() { Thread.Sleep(1); } } private static void RunTest(SqlConnection connection) { Initialize(connection); connection.Open(); DateTime start = DateTime.Now; NoBatching(connection); DateTime end = DateTime.Now; connection.Close(); Console.Write("---{0}", (end - start).Ticks); Initialize(connection); connection.Open(); start = DateTime.Now; Batching_Reflection(connection); end = DateTime.Now; connection.Close(); Console.Write("---{0}", (end - start).Ticks); Initialize(connection); connection.Open(); start = DateTime.Now; Batching_Delegates(connection); end = DateTime.Now; connection.Close(); Console.Write("---{0}", (end - start).Ticks); } private static void Batching_Delegates(SqlConnection connection) { for (int i = 0; i < iterations; i++) { SqlCommand cmd = CreateCommand(connection); append(cmd); } executeNonQuery(); } private static void Batching_Reflection(SqlConnection connection) { for (int i = 0; i < iterations; i++) { SqlCommand cmd = CreateCommand(connection); appendInfo.Invoke(sqlCmdSet, new object[] {cmd,}); } executeNonQueryInfo.Invoke(sqlCmdSet,null); } private static void NoBatching(SqlConnection connection) { List cmds = new List(); for (int i = 0; i < iterations; i++) { SqlCommand cmd = CreateCommand(connection); cmds.Add(cmd); } for (int i = 0; i < cmds.Count; i++) { cmds[i].ExecuteNonQuery(); } } private static SqlCommand CreateCommand(SqlConnection connection) { SqlCommand cmd = new SqlCommand(@"INSERT INTO [Test].[dbo].[Blogs] ([blog_name]) VALUES (@name)", connection); cmd.CommandType = CommandType.Text; cmd.Parameters.AddWithValue("@name", "foo"); return cmd; } private static void Initialize(SqlConnection connection) { Assembly sysData = Assembly.Load("System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"); Type sqlCmdSetType = sysData.GetType("System.Data.SqlClient.SqlCommandSet"); PropertyInfo connectionProp = sqlCmdSetType.GetProperty("Connection", bindingFlags); PropertyInfo cmdTimeOut = sqlCmdSetType.GetProperty("CommandTimeout", bindingFlags); sqlCmdSet = Activator.CreateInstance(sqlCmdSetType, true); connectionProp.SetValue(Program.sqlCmdSet, connection, null); cmdTimeOut.SetValue(Program.sqlCmdSet, 100000, null); append = (AppendDelegate) Delegate.CreateDelegate(typeof (AppendDelegate), Program.sqlCmdSet, "Append"); executeNonQuery = (ExecuteNonQuery) Delegate.CreateDelegate(typeof (ExecuteNonQuery), Program.sqlCmdSet, "ExecuteNonQuery"); appendInfo = sqlCmdSetType.GetMethod("Append", bindingFlags); executeNonQueryInfo = sqlCmdSetType.GetMethod("ExecuteNonQuery", bindingFlags); } } }