栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

JVM选项可优化循环语句

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JVM选项可优化循环语句

我在Java中进行了一些测试,似乎默认情况下每次都会重新计算索引和绑定。

根据Java语言规范,这是:

for(int i = 0 ; i < foo.getLength() ; i++){   }

表示

getLength()
在每次循环迭代时调用。Java编译器只有在可以有效 证明 它不会改变可观察到的行为的情况下,才 可以
getLength()
调用移出循环。 __

(例如,如果

getLength()
仅返回某个变量的值,那么JIT编译器就有可能内联该调用。如果 内联后
它可以推断出该变量不会改变(在某些假设下),则可以应用提升另一方面,如果
getLength()
涉及到获取并发或同步集合的长度,则由于其他线程的潜在作用,允许提升优化的机会微乎其微。

这就是 允许 编译器执行的操作。

我想知道是否可以在JVM HotSpot中激活这种功能?

简单回答是不。

您似乎建议使用一个编译器开关,该开关告诉/允许编译器忽略JLS规则。没有这样的开关。这样的开关将是 BAD IDEA
。可能会导致正确/有效/正在运行的程序中断。考虑一下:

class Test {   int count;   int test(String[] arg) {       for (int i = 0; i < getLength(arg); i++) {// ...       }       return count;   }   int getLength(String[] arg) {       count++;       return arg.length;   }}

如果允许编译器将

getLength(arg)
调用移出循环,则它将更改该方法被调用的次数,从而更改该
test
方法返回的值。

更改正确编写的Java程序的行为的Java优化不是有效的优化。(请注意,多线程往往会使人感到困惑。JLS,特别是内存模型规则,允许编译器执行优化,如果不同步,它们可能导致不同线程看到应用程序状态的不一致版本……正确,导致行为从开发人员的角度来看是错误的。但真正的问题在于应用程序,而不是编译器。)


顺便说一句,您不应该在循环主体中更改循环变量的一个 更有说服力的 理由是,这会使您的代码更难以理解。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/496220.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号