我的計算告訴否則......(註釋部分得到了太擁擠了。)
我將盡可能快地運行的代碼塊的時間設定金額的Java程序(1000毫秒) 。它將這樣做10次以獲得平均值,最小值和最大值。
我得說,第一種方法出來更快,平均每秒大約4,000,000循環。
這裏是我的結果:
First Method:
Least loops: 26,312,768
Most loops: 26,918,157
Average loops: 26,582,653.7
Second Method:
Least loops: 22,039,592
Most loops: 22,596,476
Average loops: 22,424,598.5
這裏的源代碼我有,請告訴我的方式,我得到了數據可能已被扭曲。我保持我的電腦常數不變,我保持代碼不變。唯一改變的是我在while
循環中調用的內容。
package personal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class SpeedTest {
public static void main(String[] args) {
int loops = 10;
double DELAY = 1000;
int i;
double[] loopCount = new double[loops + 1];
double sum = 0;
for (i = 0; i < loops + 1; i++) {
long startTime = System.currentTimeMillis();
long endTime = (long)(startTime + DELAY);
long index = 0;
while (true) {
fizzString("TEST");
//fizzString2("TEST");
long now = System.currentTimeMillis();
if (now >= endTime) {
break;
}
index++;
}
if (i != 0) {
if (DELAY != 1000) {
if (DELAY/1000 % 1 == 0) {
System.out.printf("Test %.0f. %,.0f loops in %.0f seconds.\n", (float) i, (float) index, (float) DELAY/1000);
} else if ((DELAY/100) % 1 == 0) {
System.out.printf("Test %.0f. %,.0f loops in %.1f seconds.\n", (float) i, (float) index, (float) DELAY/1000);
} else if ((DELAY/10) % 1 == 0) {
System.out.printf("Test %.0f. %,.0f loops in %.2f seconds.\n", (float) i, (float) index, (float) DELAY/1000);
} else if (DELAY % 1 == 0) {
System.out.printf("Test %.0f. %,.0f loops in %.3f seconds.\n", (float) i, (float) index, (float) DELAY/1000);
}
} else {
System.out.printf("Test %.0f. %,.0f loops in %.0f second.\n", (float) i, (float) index, (float) DELAY/1000);
}
loopCount[i] = index;
}
}
Arrays.sort(loopCount);
System.out.printf("Least loops: %,.0f\n", (loopCount[1]));
System.out.printf("Most loops: %,.0f\n", loopCount[loops]);
for (int d = 1; d < loopCount.length; d++) {
sum += loopCount[d];
}
double averageLoopCount = 1.0f * sum/(loopCount.length - 1);
System.out.printf("Average loops: %,.1f", averageLoopCount);
}
public static String fizzString(String str) {
if (str.startsWith("f") && str.endsWith("b")) return "FizzBuzz";
if (str.startsWith("f")) return "Fizz";
if (str.endsWith("b")) return "Buzz";
return str;
}
public static String fizzString2(String str) {
String sum = "";
if (str.startsWith("f")) sum += "Fizz";
if (str.endsWith("b")) sum += "Buzz";
return (sum == "") ? str : sum;
}
}
嘗試爲自己:)
第二個更快。儘管如此,我認爲FizzBuzz在現實世界中的表現並不重要。 – erickson
在現實世界中?可能不會。在一個挑剔的世界裏,這兩種方法都存在權衡。第一種方法使用'串聯',這可能是[臭名昭着的緩慢](http://stackoverflow.com/q/1532461/758280)。第二種方法使用比第一種更多的條件。 – Jeffrey
在解決方案#2的最壞情況下,字符串串聯不值得進行額外的條件檢查。您可能需要爲字符串串聯分配更多的內存,這比檢查布爾條件要慢得多 –