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是个不错的选择。
     
     
     




  • 相关阅读:
    http协议相关知识
    linux 常用命令总结
    PHP traits
    php 正则案例
    php 中关于正则 元字符
    【U3D】 第三人称控制器ThirdPersonCharacter添加之后角色原地打转不移动的问题(unity5.3.5f)
    .Net Core异步async/await探索
    IdentityServer4实现单点登录统一认证
    CSAPP-Tiny Web服务器【2】源码解析
    CSAPP-Tiny Web服务器【1】编译搭建
  • 原文地址:https://www.cnblogs.com/weapon/p/3087019.html
Copyright © 2011-2022 走看看