- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
javac 或 JIT 是否优化了不必要的自动装箱?假设我们有一段代码。
for(int i=0; i<100000; i++) {
f(i);
}
void f(Integer i) {
System.out.println(i);
}
如何优化这段代码?我猜 f
将被内联,但是 int
的不必要的装箱呢(它没有被修改并且永远不会是 null
)。假设该方法不是从任何其他代码片段调用的。如果方法签名是
会有什么不同吗 void f(final Integer i)
?
最佳答案
OpenJDK 和 HotSpot JVM 5 - 8 不会优化它们,除非它们不被使用(即使不总是这样)
但是,当您提出这些问题或回答这些问题时,一定要有远见。 Autoboixing 与将数字转换为字符串的代码(JVM 执行此操作的方式)相比是微不足道的,与写入控制台相比也是微不足道的。如果你取出 System.out.println() 这将节省 99.99% 以上的时间,所以担心这里的自动装箱是担心错误的事情。
在您的特定情况下,它无法优化自动装箱的方式,因为调用了 PrintStream.println(Object) 。 JVM 通常不理解库的作用,并且它不能假设调用 PrintStream.println(int) 会做同样的事情。
关于java - JVM 是否优化了不必要的自动装箱?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21954137/
jQuery attributeContainsPrefix [name^="value"] 对比 attributeStartsWith [name|="value"] 实际区别是什么? 最佳答案
在1.1部分在RFC 6749中,有四种角色:资源拥有者、资源服务器、客户端和授权服务器。 如果客户端和资源所有者是同一实体,OAuth 是否变得多余或不必要? 例如,我有一个封闭的 API 和一个面
我有一段代码,其中有一个带有保护子句的 raise 语句: def validate_index index # Change to SizeError raise ArgumentError
我看到了这篇文章( JPA Entity Lifecycle Events vs database trigger ),但它并没有像我在这里那样明确地询问: 当我插入 PK 值为 (null) 的行时
所以,我有一段代码看起来像 if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2){ // Do something }
我是一名优秀的程序员,十分优秀!