Why does Java switch on contiguous ints appear to run faster with added cases?

后端 未结 4 1866
南旧
南旧 2020-11-28 00:24

I am working on some Java code which needs to be highly optimized as it will run in hot functions that are invoked at many points in my main program logic. Part of this code

4条回答
  •  自闭症患者
    2020-11-28 01:16

    Since the question is already answered (more or less), here is some tip. Use

    private static final double[] mul={1d, 10d...};
    static double multiplyByPowerOfTen(final double d, final int exponent) {
          if (exponent<0 || exponent>=mul.length) throw new ParseException();//or just leave the IOOBE be
          return mul[exponent]*d;
    }
    

    That code uses significantly less IC (instruction cache) and will be always inlined. The array will be in L1 data cache if the code is hot. The lookup table is almost always a win. (esp. on microbenchmarks :D )

    Edit: if you wish the method to be hot-inlined, consider the non-fast paths like throw new ParseException() to be as short as minimum or move them to separate static method (hence making them short as minimum). That is throw new ParseException("Unhandled power of ten " + power, 0); is a weak idea b/c it eats a lot of the inlining budget for code that can be just interpreted - string concatenation is quite verbose in bytecode . More info and a real case w/ ArrayList

提交回复
热议问题