我是 Java 的新手,昨晚运行了一些代码,这真的让我很困扰。我正在构建一个简单的程序来显示 for 循环中的每个 X 输出,当我使用 variable % variable
和 variable % 5000
之类的模数时,我注意到了性能的巨大下降。有人能解释一下为什么会这样,是什么引起的吗?这样我才能变得更好。
这里是“高效”的代码(抱歉,如果我得到了一点语法错误,我没有在计算机上的代码现在)
long startNum = 0;
long stopNum = 1000000000L;
for (long i = startNum; i <= stopNum; i++){
if (i % 50000 == 0) {
System.out.println(i);
}
}
下面是“低效代码”
long startNum = 0;
long stopNum = 1000000000L;
long progressCheck = 50000;
for (long i = startNum; i <= stopNum; i++){
if (i % progressCheck == 0) {
System.out.println(i);
}
}
提醒你一下,我有一个日期变量来测量差异,一旦它变得足够长,第一个需要50毫秒,而另一个需要12秒左右。如果你的电脑比我的电脑更有效率,你可能不得不增加或减少 stopNum
或 progressCheck
。
我在网上寻找这个问题,但是我找不到答案,也许我只是问得不对。
编辑: 我没想到我的问题这么受欢迎,我很感激所有的答案。我确实在每一半的时间内执行了一个基准测试,低效的代码花费了相当长的时间,1/4秒与10秒左右。虽然他们使用 println,但是他们做的是相同的事情,所以我不认为这会造成很大的偏差,特别是因为这种差异是可重复的。至于答案,由于我是 Java 新手,我将让投票来决定哪个答案是最好的。我会尽量在周三之前挑一个。
编辑2: 今晚我要做另一个测试,它不是模数,而是增加一个变量,当它达到 ProgressCheck 时,它将执行一个,然后将该变量重置为0。第三个选择。
编辑3.5:
我使用了这段代码,下面将显示我的结果。.谢谢你们所有人的帮助!我还尝试将 long 的 short 值与0进行比较,这样我的所有新检查都会以“65536”的次数重复进行,使其相等。
public class Main {
public static void main(String[] args) {
long startNum = 0;
long stopNum = 1000000000L;
long progressCheck = 65536;
final long finalProgressCheck = 50000;
long date;
// using a fixed value
date = System.currentTimeMillis();
for (long i = startNum; i <= stopNum; i++) {
if (i % 65536 == 0) {
System.out.println(i);
}
}
long final1 = System.currentTimeMillis() - date;
date = System.currentTimeMillis();
//using a variable
for (long i = startNum; i <= stopNum; i++) {
if (i % progressCheck == 0) {
System.out.println(i);
}
}
long final2 = System.currentTimeMillis() - date;
date = System.currentTimeMillis();
// using a final declared variable
for (long i = startNum; i <= stopNum; i++) {
if (i % finalProgressCheck == 0) {
System.out.println(i);
}
}
long final3 = System.currentTimeMillis() - date;
date = System.currentTimeMillis();
// using increments to determine progressCheck
int increment = 0;
for (long i = startNum; i <= stopNum; i++) {
if (increment == 65536) {
System.out.println(i);
increment = 0;
}
increment++;
}
//using a short conversion
long final4 = System.currentTimeMillis() - date;
date = System.currentTimeMillis();
for (long i = startNum; i <= stopNum; i++) {
if ((short)i == 0) {
System.out.println(i);
}
}
long final5 = System.currentTimeMillis() - date;
System.out.println(
"\nfixed = " + final1 + " ms " + "\nvariable = " + final2 + " ms " + "\nfinal variable = " + final3 + " ms " + "\nincrement = " + final4 + " ms" + "\nShort Conversion = " + final5 + " ms");
}
}
结果:
不足为奇的是,由于缺乏除法,短转换是23% 的速度比“快”的方式。这很有趣。如果你需要每256次展示或者比较一些东西,你可以这样做,并且使用
if ((byte)integer == 0) {'Perform progress check code here'}
最后一个有趣的提示,使用65536的“最终声明变量”的模数(不是一个好数字)是速度(比固定值慢)的一半。在此之前,它几乎是以同样的速度进行基准测试。