赋值和比较哪个更快?

2019-05-23 14:13:56 +08:00
 atwoodSoInterest

coding 中经常遇到一种情况。对一个变量赋值,是直接赋值,还是判断之后再赋值。 体现在代码上,大概是下面这种情况( i 和 num 都是 int ): if (i > 0) num = i; 或者 num = i; 我的疑问是到底哪个更快,自己用 C#做了测试:在循环一亿次的情况下,直接赋值速度更快。但是判断赋值会有部分是执行了 if 中的代码的,所以会导致了实验不纯粹。

然后我又用下面的代码测试了下,单纯的对比赋值和比较的效率

    static void Main(string[] args)
    {
        int num;            
        Console.WriteLine(DateTime.Now.ToString("mm:ss.fff"));
        for (int i = 0; i < 100000000; i++)
        {
            if (i > 1000)
            {
                //num = int.MaxValue;
            }
        }
        Console.WriteLine(DateTime.Now.ToString("mm:ss.fff"));
        Console.WriteLine("---");
        Console.WriteLine(DateTime.Now.ToString("mm:ss.fff"));
        for (int i = 0; i < 100000000; i++)
        {

            num = int.MaxValue;                
        }
        Console.WriteLine(DateTime.Now.ToString("mm:ss.fff"));
        Console.ReadLine();
    }

结果发现还是直接赋值更快,在我本机上,判断执行一亿次速度是 226ms,赋值执行一亿次速度是 168ms。(大家也可以自己去 https://try.dot.net/试试)

最后从结果上来看,在整型的情况下,赋值是会比判断快的。

但是问题就来了,为什么呢? 我自己脑洞了一个答案,赋值到中间语言的时候就是 mov,比较到中间语言的时候是 cmp,mov 就直接把 01 丢到变量里去就可以了;但是 cmp 的话就要做减法,要做借位啊这那的操作,所以是赋值会更快。

强行解释了一波,感觉不是很信服。所以还请大家集思广益,破除疑惑~

6349 次点击
所在节点    编程
23 条回复
atwoodSoInterest
2019-05-24 18:08:31 +08:00
@hmzt 这个超出我知识范畴了,是怎么分辨来自内存还是来自寄存器的啊?还请赐教~
c4f36e5766583218
2019-05-28 12:36:46 +08:00
年轻的时候我也纠结过这个问题。
atwoodSoInterest
2019-05-28 17:56:08 +08:00
@c4f36e5766583218 哈哈,所以纠结的结果呢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/566943

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX