在Java中将String与null进行比较所花费的时间偶尔会出现峰值

时间:2014-09-02 14:05:57

标签: java performance testing null

我想通过在函数开头删除(Object == null)检查来节省时间。我进行了以下四项测试:

    String test = null;
    String test2 = "Hello";
    String test3 = "ASMDAKLSMDKLÖASDJAKLHRFÖKLASJDKLASMDKLASJDMASKLDMASKLÖDMASKLDMASKLÖMDKLÖASMDKASMDKL";
    int u, v;
    u = 1;
    v = 1;
    long max = 999999999l;
    long time;

    time = System.currentTimeMillis();
    for(int i = 0; i < max; i++) {
        if(test == null) u = v;
    }
    System.out.println("Test 1: " + (System.currentTimeMillis() - time) + " ms.");

    time = System.currentTimeMillis();
    for(int i = 0; i < max; i++) {
        if(test2 == null) u = v;
    }
    System.out.println("Test 2: " + (System.currentTimeMillis() - time) + " ms.");

    time = System.currentTimeMillis();
    for(int i = 0; i < max; i++) {
        if(test3 == null) u = v;
    }
    System.out.println("Test 3: " + (System.currentTimeMillis() - time) + " ms.");

    time = System.currentTimeMillis();
    for(int i = 0; i < max; i++) {
    }
    System.out.println("Test 3: " + (System.currentTimeMillis() - time) + " ms.");

事实证明,大多数情况下,差异在误差范围内。大多数情况下,所有四个函数都需要大约385毫秒才能完成,并且所有函数都在2毫秒内完成,即使是没有比较的函数。

但是,每隔一段时间,也许每四次运行一次,其中一项功能比其他功能要长。这总是测试2,时间总是在570毫秒左右。

任何想法为什么?我理解当我使用计算机时可能会出现性能下降,但它始终处于相同的测试中,并且在这种情况下产生的时间在575的毫秒之内。

在我写这篇文章的时候打我,这个时间恰好是原版的1.5倍。但为什么呢?

1 个答案:

答案 0 :(得分:1)

我认为这是循环中访问变量的一些运行时优化的影响。 我在我的机器上运行了以下代码,结果总是一样。

    String test = null;
    String test2 = "Hello";
    String test3 = "ASMDAKLSMDKLÖASDJAKLHRFÖKLASJDKLASMDKLASJDMASKLDMASKLÖDMASKLDMASKLÖMDKLÖASMDKASMDKL";

    {
        int u = 1;
        int v = 1;
        long max = 999999999l;
        long time;
        time = System.currentTimeMillis();
        for(int i = 0; i < max; i++) {
            if(test == null) u = v;
        }
        System.out.println("Test 1: " + (System.currentTimeMillis() - time) + " ms.");
    }

    {
        int u = 1;
        int v = 1;
        long max = 999999999l;
        long time;
        time = System.currentTimeMillis();
        for(int i = 0; i < max; i++) {
            if(test2 == null) u = v;
        }
        System.out.println("Test 2: " + (System.currentTimeMillis() - time) + " ms.");
    }

    {
        int u = 1;
        int v = 1;
        long max = 999999999l;
        long time;
        time = System.currentTimeMillis();
        for(int i = 0; i < max; i++) {
            if(test3 == null) u = v;
        }
        System.out.println("Test 3: " + (System.currentTimeMillis() - time) + " ms.");
    }

    {
        int u = 1;
        int v = 1;
        long max = 999999999l;
        long time;
        time = System.currentTimeMillis();
        for(int i = 0; i < max; i++) {
        }
        System.out.println("Test 3: " + (System.currentTimeMillis() - time) + " ms.");
    }