在具有许多if语句的for循环中使用continue时是否获得了性能?

时间:2016-01-15 12:55:35

标签: java performance for-loop

我在java程序中有一个for循环,它循环遍历一组映射。

在循环中,我有大约10个不同的if语句,用于检查每个映射中每个键的名称。

示例:

for (<String, Object> map : object.entrySet()) {
  if (map.getKey().equals.("something") {
    do_something;
    continue;   
  }
  if (map.getKey().equals.("something_else") {
    do_something_else;
    continue;
  }
  if ...
}

添加像这样的continue语句时,我是否获得了任何性能?

当我在IDE中单步执行代码而没有这些continue语句时,即使第一个if语句匹配,也会对每个if语句进行测试。

如果我有这样的和第一个if匹配,for循环将跳过接下来的9个if语句并继续下一个对象。 也许编译后的代码会以不同的方式处理它,添加的continue语句实际上会使循环更慢?

4 个答案:

答案 0 :(得分:7)

不是一直使用continue,而只需执行一次getKey()并使用else if

for (Map.Entry<String, Object> entry : map.entrySet()) {
    String key = entry.getKey();
    if (key.equals("something")) {
        // ...
    } else if (key.equals("something else")) {
        // ...
    }
}

或使用switch声明:

for (Map.Entry<String, Object> entry : map.entrySet()) {
    switch (entry.getKey()) {
        case "something":
            // ...
            break;

        case "something else":
            // ...
            break;
}

答案 1 :(得分:4)

如果希望在第一个条件求值为true后结束当前迭代,则应使用if-else-if-...-else。在我看来,这比使用continue更清楚,因为这就是这种语法的存在。

for (<String, Object> map : object.entrySet()) {
  if (map.getKey().equals.("something") {
    do_something;  
  }
  else if (map.getKey().equals.("something_else") {
    do_something_else;
  }
  else if (...) {
      ...
  }
  ... else {
      ...
  }
}

答案 2 :(得分:0)

对于您当前的实现,是的,您通过使用continue关键字跳过剩余的if语句来获得性能提升,尽管只有10个“if”语句的常量,但它并没有那么糟糕(10n = O (n)时间)。话虽如此,正如Eran所说,更实际的方法是使用else if语句,这将达到您目前使用的相同结果。

答案 3 :(得分:-1)

因为您只有几个值,IMO,如果您将字符串映射到整数,那么您将在此处获得真正的性能改进,因为int比较比字符串比较更快。

检查出来

public class Lab1 {

    public static void main(String[] args) {

        usingStrings();
        usingInts();


    }

    private static void usingInts() {
        int[] samples = new int[100000000];
        int[] values = {1,2,3,4};
        for(int i=0;i<samples.length-1;i++) {
            samples[i] = values[(int)(Math.random()*values.length)];
        }
        int total = 0;
        long ini = System.currentTimeMillis();
        for(int i=0;i<samples.length-1;i++) {
            if (1 == (samples[i])) {
                total+=doSomeJob();
            }else if (2 == (samples[i])) {
                total+=doSomeJob();
            }else if (3 == (samples[i])) {
                total+=doSomeJob();
            }else {
                total+=doSomeJob();
            }

        }
        long end = System.currentTimeMillis();
        System.out.println("Ints="+(end-ini));
    }

    private static void usingStrings() {
        String[] samples = new String[100000000];
        String[] values = {"one mule","two mules","three mules","four mules"};
        for(int i=0;i<samples.length-1;i++) {
            samples[i] = values[(int)(Math.random()*values.length)];
        }
        int total = 0;
        long ini = System.currentTimeMillis();
        for(int i=0;i<samples.length-1;i++) {
            if ("one mule".equals(samples[i])) {
                total+=doSomeJob();
            }else if ("two mules".equals(samples[i])) {
                total+=doSomeJob();
            }else if ("three mules".equals(samples[i])) {
                total+=doSomeJob();
            }else {
                total+=doSomeJob();
            }
        }
        long end = System.currentTimeMillis();
        System.out.println("Strings="+(end-ini));
    }

    /**
     * 
     */
    private static int doSomeJob() {
        int c = 0;
        for(int i=0;i<1000;i++) {
            c++;
        }
        return c;
    }
}

输出

Strings=962
Ints=6

实际上是DBMS索引在幕后工作的方式