将object强制转换成int效率测试

今天阅读代码时发现下面这句代码
            string SqlCount = "select count(" + IndexField + ") from " + SqlTablesAndWhere;
            cmd.CommandText = SqlCount;
            RecordCount = (int)cmd.ExecuteScalar();
写过代码的都知道ExecuteScalar()是干什么的,它返回的是SQL语句执行结果集的第一行第一列,类型是object 那么上面的代码强制转换是一定能成功的。
不过出于平时总听到或见到说尽量不要用强制转换,要用int.Parse或Convert.ToInt32之类的代替。所以一直对(int)是避而远之,但在反编译微软System.Web库时发现里面很多地方还是用到了是直接用的(int),于是有我以下测试.
 
测试代码1
        private static void Test3(int count) {
            int x;
            object y = 4;
            DateTime dt1 = DateTime.Now;
            for (int i = 0; i < count; i++)
            {
                x = Convert.ToInt32(y);
            }
            DateTime dt2 = DateTime.Now;
            for (int i = 0; i < count; i++)
            {
                x = (int)y;
            }
            DateTime dt3 = DateTime.Now;
            //for (int i = 0; i < count; i++)   //Parse只能将字符串转成int 这里跳过测试
            //{
            //    x = int.Parse("4");
            //}
            //DateTime dt4 = DateTime.Now;
            Console.WriteLine("---------" + (dt2 - dt1).ToString());
            Console.WriteLine("*********" + (dt3 - dt2).ToString());
            //Console.WriteLine("*********" + (dt4 - dt3).ToString());
            Console.Read();
        }
在控制台调用,传参100000000,执行结果为
 
 
测试代码2
        private static void Test3(int count) {
            int x;
            string y = "4";
            DateTime dt1 = DateTime.Now;
            for (int i = 0; i < count; i++)
            {
                x = Convert.ToInt32(y);
            }
            DateTime dt2 = DateTime.Now;
            //for (int i = 0; i < count; i++)
            //{
            //   x = (int)y;  //无法将string转换成int
            //}
            DateTime dt3 = DateTime.Now;
            for (int i = 0; i < count; i++)   //Parse只能将字符串转成int 这里跳过测试
            {
                x = int.Parse(y);
            }
            DateTime dt4 = DateTime.Now;
            Console.WriteLine("---------" + (dt2 - dt1).ToString());
            //Console.WriteLine("*********" + (dt3 - dt2).ToString());
            Console.WriteLine("*********" + (dt4 - dt3).ToString());
            Console.Read();
        }
同样在控制台调用,传参100000000,执行结果为
 
测试代码3
        private static void Test3(int count) {
            int x;
            object y = 4;
            DateTime dt1 = DateTime.Now;
            for (int i = 0; i < count; i++)
            {
                x = Convert.ToInt32(y);
            }
            DateTime dt2 = DateTime.Now;
            //for (int i = 0; i < count; i++)
            //{
            //   x = (int)y;  //无法将string转换成int
            //}
            DateTime dt3 = DateTime.Now;
            for (int i = 0; i < count; i++)   //Parse只能将字符串转成int 这里跳过测试
            {
                x = int.Parse(y.ToString());
            }
            DateTime dt4 = DateTime.Now;
            Console.WriteLine("---------" + (dt2 - dt1).ToString());
            //Console.WriteLine("*********" + (dt3 - dt2).ToString());
            Console.WriteLine("*********" + (dt4 - dt3).ToString());
            Console.Read();
        }
同样在控制台调用,传参100000000,执行结果为
 
其实做这些测试挺无聊的,还可能招来一片骂声,说什么要效率你用汇编,C或更进一步直接写机器码吧。我只是觉得在同等环境下写出相对高效的代码还是有必要的(执行高效、编写高效果和阅读高效)。
通过以前测试我们可以得到结论。
 
像我上面那种可以肯定能转成int的Object,直接用(int)就行了。在实际应用中,通常在转换前还得做各种判断。比如null,或是否能转换成功之类的就用其它方式。
如果要转的不是字符串,用Convert.ToInt32(),如果是字符串就用Int.Parse();这些都必须在转换之前做些必要的判断,挺麻烦的。
想要少判断又不想程序报错使用TryParse是个不错的选择。
 
 
 




posted @ 2013-05-19 17:33  Adming  阅读(2104)  评论(0编辑  收藏  举报