Which loop is faster, while or for?

后端 未结 16 2070
我寻月下人不归
我寻月下人不归 2020-11-27 07:07

You can get the same output with for and while loops:

While:

$i = 0;
while ($i <= 10){
  print $i.\"\\n\";
  $i++;
};


        
相关标签:
16条回答
  • 2020-11-27 07:13

    They should be equal. The for loop you wrote is doing exactly the same thing that the while loop is doing: setting $i=0, printing $i, and incrementing $i at the end of the loop.

    0 讨论(0)
  • 2020-11-27 07:13

    That will depend on the language implementation of said loop, compiler and what not.

    Most compiler will compile to the exact same executable code for example in CIL (.NET) they definitely do.

    Source: vcsjones @ http://forums.asp.net/t/1041090.aspx

    Either way, the body of the loop is where the processing time will be spent not the way you iterate.

    0 讨论(0)
  • 2020-11-27 07:16

    Set the loop iterations to 10,000.

    Find the time in milliseconds>Run Loop>find time in milliseconds and subtract the first timer.

    Do it for both codes, what ever one has the lowest milliseconds it runs faster. You might want to run the test multiple times and average them out to reduce the likelihood of background processes influencing the test.

    You are likely to get really similar times on both of them, but I am interested to see if one is always just slightly faster.

    0 讨论(0)
  • 2020-11-27 07:16

    I used a for and while loop on a solid test machine (no non-standard 3rd party background processes running). I ran a for loop vs while loop as it relates to changing the style property of 10,000 <button> nodes.

    The test is was run consecutively 10 times, with 1 run timed out for 1500 milliseconds before execution:

    Here is the very simple javascript I made for this purpose

    function runPerfTest() {
        "use strict";
    
        function perfTest(fn, ns) {
            console.time(ns);
            fn();
            console.timeEnd(ns);
        }
    
        var target = document.getElementsByTagName('button');
    
        function whileDisplayNone() {
            var x = 0;
            while (target.length > x) {
                target[x].style.display = 'none';
                x++;
            }
        }
    
        function forLoopDisplayNone() {
            for (var i = 0; i < target.length; i++) {
                target[i].style.display = 'none';
            }
        }
    
        function reset() {
            for (var i = 0; i < target.length; i++) {
                target[i].style.display = 'inline-block';
            }
        }
    
        perfTest(function() {
            whileDisplayNone();
        }, 'whileDisplayNone');
    
        reset();
    
        perfTest(function() {
            forLoopDisplayNone();
        }, 'forLoopDisplayNone');
    
        reset();
    };
    
    $(function(){
        runPerfTest();
        runPerfTest();
        runPerfTest();
        runPerfTest();
        runPerfTest();
        runPerfTest();
        runPerfTest();
        runPerfTest();
        runPerfTest();
        setTimeout(function(){
            console.log('cool run');
            runPerfTest();
        }, 1500);
    });
    

    Here are the results I got

    pen.js:8 whileDisplayNone: 36.987ms
    pen.js:8 forLoopDisplayNone: 20.825ms
    
    pen.js:8 whileDisplayNone: 19.072ms
    pen.js:8 forLoopDisplayNone: 25.701ms
    
    pen.js:8 whileDisplayNone: 21.534ms
    pen.js:8 forLoopDisplayNone: 22.570ms
    
    pen.js:8 whileDisplayNone: 16.339ms
    pen.js:8 forLoopDisplayNone: 21.083ms
    
    pen.js:8 whileDisplayNone: 16.971ms
    pen.js:8 forLoopDisplayNone: 16.394ms
    
    pen.js:8 whileDisplayNone: 15.734ms
    pen.js:8 forLoopDisplayNone: 21.363ms
    
    pen.js:8 whileDisplayNone: 18.682ms
    pen.js:8 forLoopDisplayNone: 18.206ms
    
    pen.js:8 whileDisplayNone: 19.371ms
    pen.js:8 forLoopDisplayNone: 17.401ms
    
    pen.js:8 whileDisplayNone: 26.123ms
    pen.js:8 forLoopDisplayNone: 19.004ms
    
    pen.js:61 cool run
    pen.js:8 whileDisplayNone: 20.315ms
    pen.js:8 forLoopDisplayNone: 17.462ms
    

    Here is the demo link

    Update

    A separate test I have conducted is located below, which implements 2 differently written factorial algorithms, 1 using a for loop, the other using a while loop.

    Here is the code:

    function runPerfTest() {
        "use strict";
    
        function perfTest(fn, ns) {
            console.time(ns);
            fn();
            console.timeEnd(ns);
        }
    
        function whileFactorial(num) {
            if (num < 0) {
                return -1;
            }
            else if (num === 0) {
                return 1;
            }
            var factl = num;
            while (num-- > 2) {
                factl *= num;
            }
            return factl;
        }
    
        function forFactorial(num) {
            var factl = 1;
            for (var cur = 1; cur <= num; cur++) {
                factl *= cur;
            }
            return factl;
        }
    
        perfTest(function(){
            console.log('Result (100000):'+forFactorial(80));
        }, 'forFactorial100');
    
        perfTest(function(){
            console.log('Result (100000):'+whileFactorial(80));
        }, 'whileFactorial100');
    };
    
    (function(){
        runPerfTest();
        runPerfTest();
        runPerfTest();
        runPerfTest();
        runPerfTest();
        runPerfTest();
        runPerfTest();
        runPerfTest();
        runPerfTest();
        console.log('cold run @1500ms timeout:');
        setTimeout(runPerfTest, 1500);
    })();
    

    And the results for the factorial benchmark:

    pen.js:41 Result (100000):7.15694570462638e+118
    pen.js:8 whileFactorial100: 0.280ms
    pen.js:38 Result (100000):7.156945704626378e+118
    pen.js:8 forFactorial100: 0.241ms
    pen.js:41 Result (100000):7.15694570462638e+118
    pen.js:8 whileFactorial100: 0.254ms
    pen.js:38 Result (100000):7.156945704626378e+118
    pen.js:8 forFactorial100: 0.254ms
    pen.js:41 Result (100000):7.15694570462638e+118
    pen.js:8 whileFactorial100: 0.285ms
    pen.js:38 Result (100000):7.156945704626378e+118
    pen.js:8 forFactorial100: 0.294ms
    pen.js:41 Result (100000):7.15694570462638e+118
    pen.js:8 whileFactorial100: 0.181ms
    pen.js:38 Result (100000):7.156945704626378e+118
    pen.js:8 forFactorial100: 0.172ms
    pen.js:41 Result (100000):7.15694570462638e+118
    pen.js:8 whileFactorial100: 0.195ms
    pen.js:38 Result (100000):7.156945704626378e+118
    pen.js:8 forFactorial100: 0.279ms
    pen.js:41 Result (100000):7.15694570462638e+118
    pen.js:8 whileFactorial100: 0.185ms
    pen.js:55 cold run @1500ms timeout:
    pen.js:38 Result (100000):7.156945704626378e+118
    pen.js:8 forFactorial100: 0.404ms
    pen.js:41 Result (100000):7.15694570462638e+118
    pen.js:8 whileFactorial100: 0.314ms
    

    Conclusion: No matter the sample size or specific task type tested, there is no clear winner in terms of performance between a while and for loop. Testing done on a MacAir with OS X Mavericks on Chrome evergreen.

    0 讨论(0)
  • 2020-11-27 07:18

    That clearly depends on the particular implementation of the interpreter/compiler of the specific language.

    That said, theoretically, any sane implementation is likely to be able to implement one in terms of the other if it was faster so the difference should be negligible at most.

    Of course, I assumed while and for behave as they do in C and similar languages. You could create a language with completely different semantics for while and for

    0 讨论(0)
  • 2020-11-27 07:18

    In C#, the For loop is slightly faster.

    For loop average about 2.95 to 3.02 ms.

    The While loop averaged about 3.05 to 3.37 ms.

    Quick little console app to prove:

     class Program
        {
            static void Main(string[] args)
            {
                int max = 1000000000;
                Stopwatch stopWatch = new Stopwatch();
    
                if (args.Length == 1 && args[0].ToString() == "While")
                {
                    Console.WriteLine("While Loop: ");
                    stopWatch.Start();
                    WhileLoop(max);
                    stopWatch.Stop();
                    DisplayElapsedTime(stopWatch.Elapsed);
                }
                else
                {
                    Console.WriteLine("For Loop: ");
                    stopWatch.Start();
                    ForLoop(max);
                    stopWatch.Stop();
                    DisplayElapsedTime(stopWatch.Elapsed);
                }
            }
    
            private static void WhileLoop(int max)
            {
                int i = 0;
                while (i <= max)
                {
                    //Console.WriteLine(i);
                    i++;
                };
            }
    
            private static void ForLoop(int max)
            {
                for (int i = 0; i <= max; i++)
                {
                    //Console.WriteLine(i);
                }
            }
    
            private static void DisplayElapsedTime(TimeSpan ts)
            {
                // Format and display the TimeSpan value.
                string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
                    ts.Hours, ts.Minutes, ts.Seconds,
                    ts.Milliseconds / 10);
                Console.WriteLine(elapsedTime, "RunTime");
            }
        }
    
    0 讨论(0)
提交回复
热议问题