Menu

#390 Bad CPU constant calculation on Java 9

1.9.3.0
closed
None
1
2017-10-17
2017-10-03
No

CPU constant calculation produces drastically different results on Java 9.

Performing "Options -> Recalculate CPU constant" on an idle system on Java 9:

Each robot will be allowed a maximum of 1780688 nanoseconds per turn on this system.

On Java 8u144:

Each robot will be allowed a maximum of 6320512 nanoseconds per turn on this system.

And robots skip many turns on Java 9:

=========================
Round 1 of 10
=========================
SYSTEM: Neuromancer 5.8 (2) skipped turn 257
SYSTEM: Neuromancer 5.8 (2) skipped turn 309
SYSTEM: Neuromancer 5.8 (2) skipped turn 321
SYSTEM: Neuromancer 5.8 (2) skipped turn 322
SYSTEM: Neuromancer 5.8 (2) skipped turn 477
SYSTEM: Neuromancer 5.8 (2) skipped turn 491
SYSTEM: Neuromancer 5.8 (2) skipped turn 610
SYSTEM: Neuromancer 5.8 (2) skipped turn 864
SYSTEM: Neuromancer 5.8 (2) skipped turn 877
SYSTEM: Neuromancer 5.8 (2) skipped turn 889
SYSTEM: Neuromancer 5.8 (2) skipped turn 903
SYSTEM: Neuromancer 5.8 (2) skipped turn 966
SYSTEM: Neuromancer 5.8 (2) skipped turn 1015
SYSTEM: Neuromancer 5.8 (2) skipped turn 1031
SYSTEM: Neuromancer 5.8 (2) skipped turn 1037
SYSTEM: Neuromancer 5.8 (2) skipped turn 1052
SYSTEM: Neuromancer 5.8 (2) skipped turn 1081
SYSTEM: Neuromancer 5.8 (2) skipped turn 1139
SYSTEM: Neuromancer 5.8 (2) skipped turn 1173
SYSTEM: Neuromancer 5.8 (2) skipped turn 1262
SYSTEM: Neuromancer 5.8 (2) skipped turn 1381
SYSTEM: jk.melee.Neuromancer 5.8 (2) has died

This does not happen on Java 8.

This is all on Robocode 1.9.2.6 on Windows 10.

Discussion

  • Flemming N. Larsen

    The CpuConstant is calculated with the CpuConstant class in Robocode. The calculation is performed with this loop:

    while (System.currentTimeMillis() - start < TEST_PERIOD_MILLIS) {
        d += Math.hypot(Math.sqrt(Math.abs(Math.log(Math.atan(Math.random())))),
                Math.cbrt(Math.abs(Math.random() * 10)))
                / Math.exp(Math.random());
        count++;
    }
    

    I did some benchmarking on the Math operations for both Java 8 and 9. Here is the results.

    Java 8:
    random(): 241
    atan(x): 111
    log(x): 1234
    abs(x): 16
    sqrt(x): 43
    cbrt(x): 115
    exp(x): 9144

    Java 9:
    random(): 246
    atan(x): 120
    log(x): 81
    abs(x): 17
    sqrt(x): 44
    cbrt(x): 36
    exp(x): 75

    So... log(x), cbrt(), and exp() seems to be incredible optimized on Java 9, and hence the CpuConstant score gets higher with Java 9, as Robocode thinks the machine power is greater.

    I will have to figure out how to perform a new benchmarking, which is compatible with the one from Java 8.

     
  • Flemming N. Larsen

    • status: open --> pending
    • assigned_to: Flemming N. Larsen
    • Group: Future Release --> 1.9.3.0
     
  • Flemming N. Larsen

    A fix has been made. The CPU benchmark uses mathematical functions. Two of those functions are Math.log() and Math.exp(), which have been greatly optimized in Java 9, meaning that they run faster.
    The fix compensates for the faster functions for Java 9, so the CPU constant will be the same under Java 8 and 9.

    I have tested this under Wndows 10 with 4 cores with hyber-threading, and Debian Linux with only 2 cores. The fix seems to work under both systems.

     

    Last edit: Flemming N. Larsen 2017-10-06
  • MultiplyByZer0

    MultiplyByZer0 - 2017-10-07

    Looks like an acceptable fix.

    With the latest git master version of Robocode, on Windows 10, on Java 8:

    Each robot will be allowed a maximum of 6557459 nanoseconds per turn on this system.
    

    On Java 9:

    Each robot will be allowed a maximum of 5743463 nanoseconds per turn on this system.
    
     
  • Flemming N. Larsen

    • status: pending --> closed
     

Log in to post a comment.