c#布尔比较与设置性能

本文关键字:设置 性能 比较 布尔 | 更新日期: 2023-09-27 18:02:47

在c#中,假设我有一个foreach循环,迭代器可能为空。在循环之后,只有迭代器不为空时才需要执行更多操作。所以我在循环之前声明bool res = false;。是在每个循环迭代中设置res = true;更快,还是像if (!res) res = true;一样测试它是否已经完成?我想这个问题可以更简洁地表述为"设置bool的值或测试它的值哪个更快?"

此外,即使一个比另一个稍微快一点,在循环中进行如此多的迭代,对性能的影响不容忽视,这是否可行?

c#布尔比较与设置性能

打发时间:

static void Main(string[] args)
    {
        bool test = false;
        Stopwatch sw = new Stopwatch();
        sw.Start();
        for (long i = 0; i < 100000000; i++)
        {
            if (!test)
                test = true;
        }
        sw.Stop();

        Console.WriteLine(sw.ElapsedMilliseconds + ". Hi, I'm just using test  somehow:" + test);
        sw.Reset();
        bool test2 = false;
        sw.Start();
        for (long i = 0; i < 100000000; i++)
        {
                test2 = true;
        }
        sw.Stop();
        Console.WriteLine(sw.ElapsedMilliseconds + ". Hi, I'm just using test2 somehow:" + test2);
        Console.ReadKey();
    }

输出:448年
379

所以,除非遗漏了什么,直接设置值比检查然后设置它要快。这就是你想测试的吗?

编辑:

修正了在注释中指出的错误。顺便说一下,我确实运行了几次这个测试,即使毫秒改变了,第二种情况总是稍微快一些。

if (!res) res = true是多余的。

编译器应该足够聪明,知道res将总是最终为真,并删除你的if语句和/或完全删除集合,如果你用发布/优化代码编译。


到你的问题本身。设置原始值应该比实际比较和设置更快。我非常怀疑您是否能够在一个原语上准确地测量时差,并且仅仅考虑这一点比在x夸张迭代中消耗更多的时间。