0

I have 2 classes: 1. DeviceData 2. MinDeviceData

DeviceData class contains 15 fields and methods, while MinDeviceData contains only one field - int count and some methods.

In my code, I am trying to do a performance test on 100k operations of fromString from string to this class. I expect the time result to be consistent, but every time I run the test - I get different result.

Why?

This is my code:

@Test
    public void checkClasses() throws IOException, InterruptedException {
        String pkt = "BIG JSON OBJECT HERE";
        for (int x = 0; x <= 5; x++) {
            TimeUnit.SECONDS.sleep(5);

            /**
             * Check NO FIF
             */
            ObjectMapper om = new ObjectMapper();
            HashMap hm = new HashMap<>();

            int cycle = 100000;
            long startTime = System.nanoTime();
            for (int i = 0; i <= cycle; i++) {
                DeviceData.fromString(pkt, om, hm);
            }
            long containsDuration = (System.nanoTime() - startTime);  //divide by 1000000 to get milliseconds.
            long object = containsDuration/cycle;
            System.out.println("--- Duration NIF: " + containsDuration +",per pkt in nano:" + object );

            TimeUnit.SECONDS.sleep(5);

            /**
             * Check FIF
             */
            Gson gson = new Gson();
            long fifStartTime = System.nanoTime();
            for (int i = 0; i <= cycle; i++) {
                DeviceDataMin.fromString(pkt, gson);
            }
            long regexDuration = (System.nanoTime() - fifStartTime);  //divide by 1000000 to get milliseconds.
            long fif = regexDuration/cycle;
            System.out.println("--- Duration FIF: " + regexDuration +",per pkt in nano:" + fif );

            System.out.println("DIFF : " + (100 - (double) ((double)fif * 100/object)));
        }
    }

Test Result (output):

--- Duration NIF: 676214146,per pkt in nano:6762
--- Duration FIF: 563609001,per pkt in nano:5636
DIFF : 16.651878142561372
--- Duration NIF: 415484807,per pkt in nano:4154
--- Duration FIF: 392932554,per pkt in nano:3929
DIFF : 5.416466056812709
--- Duration NIF: 377752426,per pkt in nano:3777
--- Duration FIF: 389876068,per pkt in nano:3898
DIFF : -3.2036007413290974
--- Duration NIF: 349583684,per pkt in nano:3495
--- Duration FIF: 392007947,per pkt in nano:3920
DIFF : -12.160228898426325
--- Duration NIF: 470443379,per pkt in nano:4704
--- Duration FIF: 368536421,per pkt in nano:3685
DIFF : 21.6624149659864
--- Duration NIF: 346816168,per pkt in nano:3468
--- Duration FIF: 354205262,per pkt in nano:3542
DIFF : -2.1337946943483246
TheUnreal
  • 23,434
  • 46
  • 157
  • 277
  • 3
    Take a look at this post: [How do I write a correct micro-benchmark in Java?](https://stackoverflow.com/questions/504103/how-do-i-write-a-correct-micro-benchmark-in-java) – Pavel Smirnov Dec 30 '19 at 13:20
  • 1
    Looks like you get some garbage collection time in the middle, to clean up all those big objects created. These happen at arbitrary times. – RealSkeptic Dec 30 '19 at 13:23
  • Thanks @PavelSmirnov it is what I looked for. I marked this question for close as duplicate – TheUnreal Jan 02 '20 at 08:06

0 Answers0