zoukankan      html  css  js  c++  java
  • 将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是个不错的选择。
     
     
     




  • 相关阅读:
    HTML5学习笔记-2.HTML基础
    HTML5学习笔记-1.网页入门
    Java学习笔记-8.多线程编程
    Java学习笔记-7.Java IO流
    Java学习笔记-6.Java异常处理
    Java学习笔记-5.常用数据结构
    Java学习笔记-4.继承与多态
    Java学习笔记-3.类与对象
    C语言学习笔记-10.文件
    .net core 中threadpool用法
  • 原文地址:https://www.cnblogs.com/weapon/p/3087019.html
Copyright © 2011-2022 走看看