项目中经常会遇到有一个思维上的困扰:是先 if 再赋值,还是直接赋值呢?
直接赋值在代码上会更加优美,减少了一层判断。但是同时也会好奇,到底哪种做法在效率上更优,这个实现也简单,就动手试了试。
拍脑袋的错误结论:判断效率优于赋值
论证:
判断之后再赋值 耗时229ms 直接赋值 耗时2703ms满以为是得出结论还是比较快一点,但是一想,不对啊,这个是数组的,相对来说,不是最简单的数据结构,换其他的试试呢。
然后换了其他数据类型试试:(下列数据都是多次实验取的中位数)
int,直接赋值:169ms , 判断赋值:233ms。
string,直接赋值:171ms , 判断赋值:228ms。
bool,直接赋值:206ms , 判断赋值:232ms。
float,直接赋值:175ms , 判断赋值:237ms。
降数据量级到1000000,测试复杂数据类型
Dictionary,直接赋值:94ms , 判断赋值:20ms。
HashTable,直接赋值:115ms , 判断赋值:20ms。
真正结论:在简单数据类型下直接赋值更快。
其实也不难理解,因为复杂数据类型具体内部的操作多所以耗时久,真正在使用中的话,这种量级的差异完全是可以忽略不计的,简单、可读才应该是需要重视的。
Readability counts
附:深入思考了下,其实以上结论都是不全面而有问题的。我们最终需要比较的其实是最终执行的底层操作效率:if 括号内的操作 和 if内的操作。用简单的例子来说明,if (i < 100) { num = 100; },这就是比较 < 100 和 = 100的执行效率,从C#往下一层到中间语言IL(intermidiate language),这个操作就变成了 cmp 和 mov(用学过的汇编做比喻),在往下就成了01的比较了。在01的比较中,因为cmp减法比较是涉及到借位减等复杂操作的,所以自然在效率上是低于直接mov赋值的,就造成了直接赋值比比较快的现象。(个人推断,没有查证)
网友评论