Is performance gained when using continue in a for-loop with many if-statements?

后端 未结 4 1644
小蘑菇
小蘑菇 2021-01-19 11:12

I have a for loop in a java program which iterates through a set of maps.

Inside the loop I have around 10 different if-statements which checks the name of each key

相关标签:
4条回答
  • 2021-01-19 11:13

    Because you have just a few values, IMO, you'll have a real performance improvement here if you map your strings to ints, since the int comparison is far faster than a String comparison.

    Check this out

    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;
        }
    }
    

    output

    Strings=962
    Ints=6
    

    which is actually how DBMS indexes work behind the scenes

    0 讨论(0)
  • 2021-01-19 11:22

    Instead of using continue all the time, do the getKey() just once and use else if:

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

    Or use a switch statement:

    for (Map.Entry<String, Object> entry : map.entrySet()) {
        switch (entry.getKey()) {
            case "something":
                // ...
                break;
    
            case "something else":
                // ...
                break;
    }
    
    0 讨论(0)
  • 2021-01-19 11:23

    If you want the current iteration to end after the first condition evaluates to true, you should use if-else-if-...-else. In my opinion, that's more clear than using continue, since that's what this syntax exists for.

    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 {
          ...
      }
    }
    
    0 讨论(0)
  • 2021-01-19 11:25

    With your current implementation, yes you are gaining a performance boost by skipping the remaining if statements using the continue keyword, although with only a constant of ten "if" statements, it's not that bad (10n = O(n) time). Having said that, the more practical way to approach this, as Eran stated, is to make use of else if statements, which will achieve the same result that you are currently using.

    0 讨论(0)
提交回复
热议问题