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




  • 相关阅读:
    洛谷P2664 树上游戏(点分治)
    洛谷P3366 【模板】最小生成树(Boruvka算法)
    loj#2312. 「HAOI2017」八纵八横(线性基 线段树分治)
    noi.ac#309 Mas的童年(子集乱搞)
    loj#6041. 「雅礼集训 2017 Day7」事情的相似度(SAM set启发式合并 二维数点)
    Windows phone应用开发[22]-再谈下拉刷新
    Windows phone应用开发[21]-图片性能优化
    Windows phone应用开发[20]-禁止Pivot手势
    Windows phone应用开发[19]-RSA数据加密
    Windows phone应用开发[18]-下拉刷新
  • 原文地址:https://www.cnblogs.com/weapon/p/3087019.html
Copyright © 2020-2023  润新知