While Loop vs Modulus 算子 [已关闭]

While Loop vs Modulus operator [closed]

提问人:Tanvi Khade 提问时间:4/15/2023 更新时间:4/15/2023 访问量:52

问:


想改进这个问题吗?通过编辑这篇文章添加详细信息并澄清问题。

7个月前关闭。

我有两个程序执行相同的任务,即计算两个数字的最小公倍数 (LCM)。第一个程序包含一个 while 循环输出,执行第二个程序。

计划1:

 temp1 = firstNumber;
        temp2 = secondNumber;

        while (firstNumber != secondNumber)
        {
            if (firstNumber > secondNumber)
            {
                firstNumber -= secondNumber;
            }
            else
            {
                secondNumber -= firstNumber;
            }
        }   

        lcm = (temp1 * temp2) / firstNumber;

enter image description here

计划2:

int f =1;
    
        //int f = firstNumber > secondNumber? (firstNumber%secondNumber == 0 ? secondNumber : 1) : (secondNumber%firstNumber == 0 ? firstNumber : 1);
        if(firstNumber > secondNumber)
        {
            if( firstNumber%secondNumber == 0)
                f = secondNumber;               
        }
        else{
            if(secondNumber%firstNumber ==0)
                f = firstNumber;
        }
        
        lcm = (firstNumber*secondNumber)/f;

enter image description here

两个程序的输入均为:1513,3

我以为随着两个数字之间差异的增加,第一个程序将花费更长的时间,但事实似乎并非如此。

第一个程序比第二个程序表现更好的原因是什么?
附言。我不是第一个程序的作者。

C# .net-core while-循环

评论

0赞 stuartd 4/15/2023
你是如何衡量的?
0赞 mlibby 4/15/2023
您用一个输入运行了一次程序?我的猜测是,该程序加载到内存中并启动所需的时间比执行一次极其简单的算术要长得多。
0赞 derpirscher 4/15/2023
首先,你的第二种方法是错误的。例如,对于输入 6 和 10,它给出 60 而不是 30 ...此外,您多久运行一次这些测试?一次?那么你的测量不足以得出任何结论。
0赞 derpirscher 4/15/2023
此外,测量是如何完成的?你用什么计时器进行测量?它是否具有足够高的分辨率来测量如此短的运行过程?
0赞 Tanvi Khade 4/15/2023
我只添加了一个结果,但多次运行测试并使用输入

答:

1赞 Tarazed 4/15/2023 #1

样本量不够大,无法得出性能结论。在代码执行过程中,可能会发生许多事情。

由于 C# 依赖于运行时,因此它执行许多可能影响性能的操作(最明显的是垃圾回收器)。即使多次运行同一程序也会有所不同。

这也是为什么你从不相信 .Net 计时器是准确的,有很多计时器选项,没有一个可以准确地计算时间。确定某物运行时间的最准确方法是在起点和终点创建两个时间戳并减去它们。

为了获得准确的基准测试,您需要平均多次运行的运行时间。

我想分享的另一件事是,很少需要对这种琐碎的代码进行性能微优化。写下让它更容易阅读的东西,不要试图从中榨取每一毫秒。大型循环任务可以按照识别的方式进行优化,但像这样的基本计算最终不会产生任何影响。