Why is i=i+1 faster than i++?

后端 未结 5 682
野性不改
野性不改 2021-01-13 09:04

Test this code in Flash:

var i:int = 0;
for (var j:int = 0; j < 5000000; j++)
{
    i=i+1;
}// use about 300ms.

i = 0;
for (var j:int = 0; j < 5000000         


        
5条回答
  •  情歌与酒
    2021-01-13 09:32

    I can't replicate this behavior all three appear to be about the same time for me

    Attempt 1
    loop 1: 378
    loop 2: 396
    loop 3: 382
    
    Attempt 2
    loop 1: 380
    loop 2: 361
    loop 3: 361
    
    Attempt 3
    loop 1: 375
    loop 2: 373
    loop 3: 355
    

    Increasing the loops by a factor of 10 I got these times:

    Attempt 1
    loop 1: 3707
    loop 2: 3663
    loop 3: 3653
    
    Attempt 2
    loop 1: 3722
    loop 2: 3632
    loop 3: 3711
    

    [TestLoopSpeed.as]

    package
    {
        import flash.display.Sprite;
        import flash.utils.getTimer;
    
        public class TestLoopSpeed extends Sprite
        {
            public function TestLoopSpeed()
            {
                var timeNow:Number = getTimer();
                var i:int = 0;
    
                var startOne:Number = getTimer();
                for (var j:int = 0; j < 5000000; j++)
                {
                    i=i+1;
                }
                var endOne:Number = getTimer();
    
    
                var startTwo:Number = getTimer();
                i = 0;
                for (var j:int = 0; j < 5000000; j++)
                {
                    i++;
                }
                var endTwo:Number = getTimer();
    
                var startThree:Number = getTimer();
                i = 0;
                for (var j:int = 0; j < 5000000; j++)
                {
                    ++i;
                }
                var endThree:Number = getTimer();
    
                trace("loop 1: " + (endOne - startOne));
                trace("loop 2: " + (endTwo - startTwo));
                trace("loop 3: " + (endThree - startThree));
            }
        }
    }
    

    So far as I understand it i++ is ultimately equivalent to i = i+1; with the exception that if an assignment is occurring on that line then the current value of i would be used and a later instruction would add one to i. ++i simply means add 1 to i before doing any other operations on this line. Ultimately I don't think any of these options should really affect performance it appears from every test I've done that the CPU scheduling at any given moment for the flash process is having more of an effect than any given operator.

    If there's something wrong with the code I'm using to test please point it out.

    Edit

    Updated the code to include the while loop option, still not seeing anything that looks like a positive significant difference:

    loop 1: 3695
    loop 2: 3698
    loop 3: 3690
    loop 4: 3711
    
    loop 1: 3758
    loop 2: 3651
    loop 3: 3707
    loop 4: 3676
    

    [TestLoopSpeed.as] Updated with fancy while loop pre-increment action

    package
    {
        import flash.display.Sprite;
        import flash.utils.getTimer;
    
        public class TestLoopSpeed extends Sprite
        {
            public function TestLoopSpeed()
            {
                var timeNow:Number = getTimer();
                var i:int = 0;
    
                var startOne:Number = getTimer();
                for (var j:int = 0; j < 50000000; j++)
                {
                    i=i+1;
                }
                var endOne:Number = getTimer();
    
    
                var startTwo:Number = getTimer();
                i = 0;
                for (var j:int = 0; j < 50000000; j++)
                {
                    i++;
                }
                var endTwo:Number = getTimer();
    
                var startThree:Number = getTimer();
                i = 0;
                for (var j:int = 0; j < 50000000; j++)
                {
                    ++i;
                }
                var endThree:Number = getTimer();
    
                var startFour:Number = getTimer();
                i = 0;
                var j:int = -1;
                while (++j < 50000000)
                {
                    ++i;
                }
                var endFour:Number = getTimer();
    
                trace("loop 1: " + (endOne - startOne));
                trace("loop 2: " + (endTwo - startTwo));
                trace("loop 3: " + (endThree - startThree));
                trace("loop 4: " + (endFour - startFour));
            }
        }
    }
    

提交回复
热议问题