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