Java中是否存在避免重复执行近期算术运算的池化机制?
Java算术运算的池化与优化问题
先看你给出的代码:
public static void test1(Point point) { Handler.doSomething(point.x / 2.0f, point.y / 1.75f); } public static void test2(Point point) { Handler.doSomething(point.x / 2.0f, point.y / 0.55f); } public static void test3(Point point) { Handler.doSomething(point.x / 2.0f, point.y / 1.25f); }
关于内置池化机制
Java没有针对这类浮点算术运算结果的内置池化机制,字符串池是专门为字符串对象复用设计的,而这里的除法运算结果是float基本类型,JVM不会为这类计算结果维护类似的缓存池。更何况每次传入的Point对象的x、y值可能不同,就算表达式一样,结果也可能完全不一样,根本没法复用。
要不要手动缓存结果?
得分场景来看:
- 如果同一个Point对象会被多次传入这些方法调用,可以考虑把计算后的结果缓存起来——比如给Point类新增缓存字段(比如
cachedXDiv2、cachedYDiv175等),或者用Map<Point, 计算结果对象>来存储,但要注意实现Point的equals和hashCode,还要警惕内存泄漏问题。 - 如果每次传入的Point都是新的、不同的对象,那完全没必要缓存,每个结果都是唯一的,缓存反而会额外占用内存,拖慢性能。
- 另外要注意,JVM的即时编译器(JIT)会自动做很多优化,比如把常量除法转换成乘法(比如
除以2.0f等价于乘以0.5f,JIT会自动替换),这类底层优化的效率比手动缓存高得多,尤其是在被频繁调用的热点代码里。
内容的提问来源于stack exchange,提问作者zaxunobi
相关产品推荐
相关产品推荐

