草庐IT

OPTIMIZATION

全部标签

java - 循环优化 Oracle Java 7-8 Hotspot VM

我想知道OracleJava7(或8)HotspotVM执行的循环优化是什么? 最佳答案 RangeCheckElimination-消除循环不变数组的范围检查。参见PhaseIdealLoop::do_range_check了解详情。优化由标志-XX:+RangeCheckElimination控制LoopPeeling-将第一次迭代从循环中分离出来并在循环体之外执行。在这里查看惊人的描述PhaseIdealLoop::do_peeling.此优化由标志-XX:PartialPeelLoop=true控制LoopPredicati

java - 哪种算法可以更快地检查某个位是否已设置?

我正在制作一款游戏,其中我将大量数据存储在一个整数或长整数中,因为我将拥有大量数据。出于性能原因,我不想使用整个类,也不需要它们。我找到了两种从整数中检索一位的方法。我想知道是否有人知道我应该使用哪个或者哪个更快。方法:return(integer&(1return(integer>>bit&0x1)==1; 最佳答案 很可能您正在测试的位比您正在测试的整数“更稳定”。因此,您可以为位设置常量,这意味着您只需进行一次移位。例如:staticfinalintLEFT_WALL=1然后在你的循环中,你只是检查if((integer&LE

java - Java 是否将除以 2 的幂的除法优化为位移位?

Java编译器或JIT编译器是否将除法或乘法优化为2的常数次幂直至移位?比如下面两条语句优化后是否相同?intmedian=start+(end-start)>>>1;intmedian=start+(end-start)/2;(基本上是thisquestion但对于Java) 最佳答案 虽然公认的答案是正确的,因为除法不能简单地用右移代替,但基准却大错特错。任何运行时间少于一秒的Java基准测试都可能衡量解释器的性能-而不是您通常关心的事情。忍不住自己写了一个benchmark,主要是说明一切都比较复杂。我并不想完全解释resul

java - 用于优化循环语句的 JVM 选项

我在学校被告知,修改for循环的索引变量是一种不好的做法:示例:for(inti=0;i争论的焦点是一些编译器优化可以优化循环,而不是在每个循环中重新计算索引和边界。我在java中做了一些测试,似乎默认情况下每次都会重新计算索引和边界。我想知道是否可以在JVMHotSpot中激活这种功能?例如优化这种循环:for(inti=0;i无需编写:intlength=foo.getLength()for(inti=0;i这只是一个例子,我很想尝试看看改进。编辑根据PeterLawrey的回答为什么在这个简单的例子中JVM不内联getLength()方法?:publicstaticvoidmai

java - 优化一个简单的搜索算法

我一直在尝试使用一个相当简单的自制搜索引擎,现在正在研究一些相关性排序代码。它不是很漂亮,但在聪明的算法方面我不是很好,所以我希望能得到一些建议:)基本上,我希望每个搜索结果都根据与搜索条件匹配的单词数进行评分。每个完全匹配的单词得3分,部分匹配得1分例如,如果我搜索“wintersnow”,结果如下:冬天雪=>6分冬天下雪ing=>4分冬天陆地雪=>4分冬天太阳=>3点冬天土地下雪ing=>2分代码如下:String[]resultWords=result.split("");String[]searchWords=searchStr.split("");intscore=0;for

java - JIT 能否从泛型中获益?

众所周知,泛型类型无法在编译过程中存活下来。它们被类转换所取代。但是,类型信息存在于类文件中并且可以使用反射看到:publicclassDemo{privateListlist;publicDemo()throwsSecurityException,NoSuchFieldException{System.out.println(((Class)((ParameterizedType)getClass().getDeclaredField("list").getGenericType()).getActualTypeArguments()[0]).getName());}publicst

java - 为什么在比较两个 boolean 值时 & 在 java 中使用 &&?

我正在查看Guava中的代码https://github.com/google/guava我看到了很多很酷的优化。我想知道在&&上使用&是否是一种优化,如果是,为什么会这样?会不会是一种风格选择?我们正在对IntMath中的intb求平方.checkedPow函数。我们要检查b*b没有溢出:checkNoOverflow(-FLOOR_SQRT_MAX_INT在这个例子中,为什么&在&&之上使用?编辑:Matt是正确的。我在Java8中编译了这段Java代码:publicstaticbooleanand(booleana,booleanb){returna&&b;}publicstat

java - 使用 Java 8 流处理嵌套集合

最近我在使用嵌套集合(List中的Maps的值)时遇到了一个问题:List>items在我的例子中,这个列表包含10-20个map。在某些时候,我不得不替换值Calculation键description至Rating.所以我想出了这个解决方案:items.forEach(e->e.replace("description","Calculation","Rating"));如果此列表中的所有映射都包含键值对["description","Calculation"],那将是一个非常好的和高效的解决方案.不幸的是,我知道在整个List>中只有一对这样的对。。问题是:是否有更好(更有效)的

java - JVM 选项 XX :UseFastEmptyMethods/XX:UseFastAccessorMethods

同时查看possibleJVMflagsforoptimizinglaunchingstartuptime在我的RCP产品中,我发现了这些名字吸引人的-XX:UseFastEmptyMethods和-XX:UseFastAccessorMethods。这些标志似乎在JDK-6上可用(默认情况下打开),而在JDK-7上它们默认关闭。另外,我读到这种优化的权衡是它们不会增加方法调用计数器。不使用调用计数器有什么影响?这会影响垃圾收集吗? 最佳答案 为了正确获取方法的调用次数,以便虚拟机更好地识别代码中的热点。根据here的讨论Ifyou

Java 自变量 vs 数组性能

我正在研究Java,想知道以下各项在性能方面有何不同。我知道过早优化是编程的困境,但我的好奇心仅供将来引用。publicclassType1{int[]data=newdata[4];publicintgetData(intindex){returndata[index];}}publicclassType2{intdata1;intdata2;intdata3;intdata4;publicintgetData1(){returndata1;}publicintgetData2(){returndata2;}publicintgetData3(){returndata3;}publi