你給出的兩種方法基本相同。你的時機正在被拋棄,主要是因爲JVM沒有升溫;直到方法或循環重複10,000次以上,熱點纔會啓動。在經過那麼多次重複之後,你可能經常也會在特別的地方進行GC踢球,以及混合中的OS進程。
要解決基準測試中的這些問題中的一些問題,請將每種方法預熱10k次並重復幾次。對於操作系統噪音,請確保儘可能多地關閉其他許多應用程序和進程,並確保機器運行空閒。操作系統當然也可以進行調整,但現在讓我們把它作爲主題。下面是一些示例代碼,可以給你一個想法,我還增加了兩種方法來優化循環;只是爲了好玩;)
我包括我得到的底部的時機。要注意的事情是
- ,你包括開始改變,但要正常化很快是差不多的兩種方法
- 代碼的成本正在被調用到System.out相形見絀;換言之,io本身。證明我已經給出了另外兩種選擇,一種是對System.out進行更多的調用,另一種是減少調用。
estimatedTime1:17.27938毫秒
estimatedTime2:17.45852毫秒
estimatedTime3:100.61994毫秒
estimatedTime4:9.553329999999999毫秒
public class Foo {
public static void main(String[] args) throws Exception {
time1();
time2();
time3();
time4();
time1();
time2();
time3();
time4();
time1();
time2();
time3();
time4();
}
private static final int REPEAT = 100;
private static void time1() {
long startTime1 = System.nanoTime();
for (int i=0; i<REPEAT; i++) {
repeatPrint1();
}
long estimatedTime1 = System.nanoTime() - startTime1;
double dur = estimatedTime1/1000000.0/REPEAT;
System.out.println("estimatedTime1: " + dur);
}
private static void time2() {
long startTime1 = System.nanoTime();
for (int i=0; i<REPEAT; i++) {
repeatPrint2();
}
long estimatedTime1 = System.nanoTime() - startTime1;
double dur = estimatedTime1/1000000.0/REPEAT;
System.out.println("estimatedTime2: " + dur);
}
private static void time3() {
long startTime1 = System.nanoTime();
for (int i=0; i<REPEAT; i++) {
repeatPrint3();
}
long estimatedTime1 = System.nanoTime() - startTime1;
double dur = estimatedTime1/1000000.0/REPEAT;
System.out.println("estimatedTime3: " + dur);
}
private static void time4() {
long startTime1 = System.nanoTime();
for (int i=0; i<REPEAT; i++) {
repeatPrint4();
}
long estimatedTime1 = System.nanoTime() - startTime1;
double dur = estimatedTime1/1000000.0/REPEAT;
System.out.println("estimatedTime4: " + dur);
}
private static void repeatPrint1() {
String name1 = null;
String name2 = null;
String name3 = null;
String name4 = null;
String name5 = null;
for (int x = 10; x < 2500; x = x + 1) {
name1 = "My Name is AAAA" + x;
name2 = "My Name is BBBB" + x;
name3 = "My Name is CCCC" + x;
name4 = "My Name is DDDD" + x;
name5 = "My Name is EEEE" + x;
System.out.print("name1 : " + name1);
System.out.print("name2 : " + name2);
System.out.print("name3 : " + name3);
System.out.print("name4 : " + name4);
System.out.print("name5 : " + name5);
System.out.println("value of x : " + x);
}
}
private static void repeatPrint2() {
for (int x = 10; x < 2500; x = x + 1) {
String Sname1 = "My Name is AAAA" + x;
String Sname2 = "My Name is BBBB" + x;
String Sname3 = "My Name is CCCC" + x;
String Sname4 = "My Name is DDDD" + x;
String Sname5 = "My Name is EEEE" + x;
System.out.print("Sname1 : " + Sname1);
System.out.print("Sname2 : " + Sname2);
System.out.print("Sname3 : " + Sname3);
System.out.print("Sname4 : " + Sname4);
System.out.print("Sname5 : " + Sname5);
System.out.println("value of x : " + x);
}
}
private static void repeatPrint3() {
for (int x = 10; x < 2500; x = x + 1) {
pr1(1, x, "AAAA");
pr1(2, x, "BBBB");
pr1(3, x, "CCCC");
pr1(4, x, "DDDD");
pr1(5, x, "EEEE");
xr1(x);
}
}
private static void pr1(int i, int x, String r) {
System.out.print("Sname");
System.out.print('0'+i);
System.out.print(" : ");
System.out.print("My Name is ");
System.out.print(r);
System.out.println(Integer.toString(x));
}
private static void xr1(int x) {
System.out.print("value of x : ");
System.out.println(Integer.toString(x));
}
private static void repeatPrint4() {
StringBuilder buf = new StringBuilder(400);
for (int x = 10; x < 2500; x = x + 1) {
pr2(buf, 1, x, "AAAA");
pr2(buf, 2, x, "BBBB");
pr2(buf, 3, x, "CCCC");
pr2(buf, 4, x, "DDDD");
pr2(buf, 5, x, "EEEE");
xr2(buf, x);
System.out.print(buf.toString());
buf.setLength(0);
}
}
private static void pr2(StringBuilder buf, int i, int x, String r) {
buf.append("Sname");
buf.append('0' + i);
buf.append(" : ");
buf.append("My Name is ");
buf.append(r);
buf.append(Integer.toString(x));
buf.append("\n");
}
private static void xr2(StringBuilder buf, int x) {
buf.append("value of x : ");
buf.append(Integer.toString(x));
buf.append("\n");
}
}
嘗試測試'repeatPrint2'之前'repeatPrint1'。你可能會得到不同的結果。 :) – MAV 2014-08-30 10:14:37
您可以討論您的測試環境,即機器,負載和運行次數嗎? – Manu 2014-08-30 10:15:41
@MAV我打算說同樣的事情 – ControlAltDel 2014-08-30 10:15:57