Which of these pieces of code is faster in Java?

前端 未结 16 2042
囚心锁ツ
囚心锁ツ 2020-11-30 04:25

a) for(int i = 100000; i > 0; i--) {}

b) for(int i = 1; i < 100001; i++) {}

The answer is t

16条回答
  •  孤城傲影
    2020-11-30 04:46

    On a modern Java implementation this is not true. Summing up the numbers up to one billion as a benchmark:

    Java(TM) SE Runtime Environment 1.6.0_05-b13
    Java HotSpot(TM) Server VM 10.0-b19
    up 1000000000: 1817ms 1.817ns/iteration (sum 499999999500000000)
    up 1000000000: 1786ms 1.786ns/iteration (sum 499999999500000000)
    up 1000000000: 1778ms 1.778ns/iteration (sum 499999999500000000)
    up 1000000000: 1769ms 1.769ns/iteration (sum 499999999500000000)
    up 1000000000: 1769ms 1.769ns/iteration (sum 499999999500000000)
    up 1000000000: 1766ms 1.766ns/iteration (sum 499999999500000000)
    up 1000000000: 1776ms 1.776ns/iteration (sum 499999999500000000)
    up 1000000000: 1768ms 1.768ns/iteration (sum 499999999500000000)
    up 1000000000: 1771ms 1.771ns/iteration (sum 499999999500000000)
    up 1000000000: 1768ms 1.768ns/iteration (sum 499999999500000000)
    down 1000000000: 1847ms 1.847ns/iteration (sum 499999999500000000)
    down 1000000000: 1842ms 1.842ns/iteration (sum 499999999500000000)
    down 1000000000: 1838ms 1.838ns/iteration (sum 499999999500000000)
    down 1000000000: 1832ms 1.832ns/iteration (sum 499999999500000000)
    down 1000000000: 1842ms 1.842ns/iteration (sum 499999999500000000)
    down 1000000000: 1838ms 1.838ns/iteration (sum 499999999500000000)
    down 1000000000: 1838ms 1.838ns/iteration (sum 499999999500000000)
    down 1000000000: 1847ms 1.847ns/iteration (sum 499999999500000000)
    down 1000000000: 1839ms 1.839ns/iteration (sum 499999999500000000)
    down 1000000000: 1838ms 1.838ns/iteration (sum 499999999500000000)
    

    Note that the time differences are brittle, small changes somewhere near the loops can turn them around.

    Edit: The benchmark loops are

            long sum = 0;
            for (int i = 0; i < limit; i++)
            {
                sum += i;
            }
    

    and

            long sum = 0;
            for (int i = limit - 1; i >= 0; i--)
            {
                sum += i;
            }
    

    Using a sum of type int is about three times faster, but then sum overflows. With BigInteger it is more than 50 times slower:

    BigInteger up 1000000000: 105943ms 105.943ns/iteration (sum 499999999500000000)
    

提交回复
热议问题