近乎空的Java For循环行为奇怪
此代码按预期打印“平均运行次数:0.99864197”近乎空的Java For循环行为奇怪,java,debugging,loops,jvm,nested-loops,Java,Debugging,Loops,Jvm,Nested Loops,此代码按预期打印“平均运行次数:0.99864197” import java.util.Random; 公共A类{ 公共静态void main(字符串[]args){ int min=-30; int max=1; 试验(最小值、最大值); } 静态孔隙试验(最小值为int,最大值为int){ 整数计数=0; 随机随机数=新随机数(0); 对于(int j=0;j
import java.util.Random;
公共A类{
公共静态void main(字符串[]args){
int min=-30;
int max=1;
试验(最小值、最大值);
}
静态孔隙试验(最小值为int,最大值为int){
整数计数=0;
随机随机数=新随机数(0);
对于(int j=0;j<2097152;j++){
整数=min+rand.nextInt(max-min+1);
对于(int i=0;i
这段代码应该打印相同的精确数字,但它会打印一个随机的负数
import java.util.Random;
public class A {
public static void main(String[] args) {
int min = -30;
int max = 1;
test(min, max);
}
static void test(int min, int max){
int count = 0;
Random rand = new Random(0);
for(int j = 0; j < 2097152; j++){
int number = min + rand.nextInt(max-min+1);
for(int i = 0; i < number; ++i) {
//System.out.print("");
count++;
}
}
System.out.println("Average Number of Runs: " + count/65536F);
}
}
import java.util.Random;
公共A类{
公共静态void main(字符串[]args){
int min=-30;
int max=1;
试验(最小值、最大值);
}
静态孔隙试验(最小值为int,最大值为int){
整数计数=0;
随机随机数=新随机数(0);
对于(int j=0;j<2097152;j++){
整数=min+rand.nextInt(max-min+1);
对于(int i=0;i
java中是否存在一些针对循环的优化
注:
它在openjdk 1.7.0_25 fedora-2.3.10.4.fc19-x86_64上运行良好。
您应该更新您的Java版本,或者确保您的问题实际上与所述的代码有关。我认为这是在某些Java 6版本中JIT处理非常紧密的循环时的一个错误。它可能是一个或一个错误
更新到Java7应该是可行的,尽管我很感激这对您的情况没有多大帮助。您可能会发现,在循环中添加一个“看起来不是no-op,但是做了一些您不关心的事情”方法调用也可以解决问题。例如,您可以将
i
的所有值相加,然后将其打印到某个诊断日志中,以便忽略。我似乎记得这是一个重复的值,但我怀疑我很难找到它。我认为这是1.6中的一个JIT错误,它在Java7中得到了修复。你能在Java 7上试用吗?@JonSkeet我刚刚在Java 7上试用过,效果非常好。在jre 7u25上运行代码似乎可以解决这个问题,所以在Java 6中它似乎确实是一个bug。这种情况很糟糕,因为minecraft社区中有相当多的人似乎不知道如何更新,而这段代码是我一直在进行的游戏修改的一部分。。。另外@Jon Skeet你能发布一个答案,这样我就可以把它标记为已接受吗?@ZaideChris:可以,尽管我不确定它是否值得这么多…这两个代码版本在java 1.6.026上都能完美工作。
import java.util.Random;
public class A {
public static void main(String[] args) {
int min = -30;
int max = 1;
test(min, max);
}
static void test(int min, int max){
int count = 0;
Random rand = new Random(0);
for(int j = 0; j < 2097152; j++){
int number = min + rand.nextInt(max-min+1);
for(int i = 0; i < number; ++i) {
//System.out.print("");
count++;
}
}
System.out.println("Average Number of Runs: " + count/65536F);
}
}