摘自傳智播客
package test; public class Arithmetic4 { public static void main(String[] args) { //問題:計算求出1到10000的所有質數 //問題:計算求出1到100000000的所有質數 int num = 1000000; /* * 方案一 */ long start = System.currentTimeMillis(); for(int i=1;i<num;i++) { for(int j=2;j<i;j++) { if(i%j==0) break; if(j==i-1) System.out.println(i); } } System.out.println("-----------------------"); long end1 = System.currentTimeMillis(); /* * 方案二 */ System.out.println(3); for(int i=1;i<=num;i++) { for(int j=2;j<=Math.sqrt(i);j++) { if(i%j==0) break; if(j==(int)Math.sqrt(i)) System.out.println(i); } } System.out.println("-----------------------"); long end2 = System.currentTimeMillis(); /* * 方案三 */ System.out.println(3); for(int i=1;i<=num;i+=2) { for(int j=2;j<=Math.sqrt(i);j++) { if(i%j==0) break; if(j==(int)Math.sqrt(i)) System.out.println(i); } } System.out.println("----------------"); long end3 = System.currentTimeMillis(); /* * 方案四 */ int[] nums = new int[100]; nums[0] = 2; int temp = 1; for(int i=2;i<num;i++) { for(int j=0;j<temp;j++) { if(i%nums[j]==0) break; if((j+1)==temp) { if(temp == nums.length) { int[] tempNums = new int[nums.length*2]; for(int k=0;k<nums.length;k++) { tempNums[k] = nums[k]; } nums = tempNums; } nums[temp] = i; temp++; } } } for(int i=1;nums[i]!=0;i++) { System.out.println(nums[i]); } long end4 = System.currentTimeMillis(); /* * 時間對比 */ System.out.println("方案一:"+(end1-start)+"ms"); System.out.println("方案二:"+(end2-end1)+"ms"); System.out.println("方案三:"+(end3-end2)+"ms"); System.out.println("方案四:"+(end4-end3)+"ms"); } }
從方案一到方案四都是優化了計算次數,爲什麼方案四所用時間反而大於方案三和方案四呢?
原因在於程序運行時間並沒有像我們預期的那樣,我們忽略了一些小細節,就是不同的操作符所用時間是不同的,當循環數足夠大時,它們的差值能蓋過你所優化的時間。
小實驗:
long start = System.currentTimeMillis(); int[] num = new int[10]; for(int i = 0;i<100000000;i++) { if(num[1]==1) ; } long end = System.currentTimeMillis(); System.out.println((end-start) + "ms");
long start = System.currentTimeMillis(); int j = 0; for(int i = 0;i<100000000;i++) { j++; } long end = System.currentTimeMillis(); System.out.println((end-start) + "ms");
像這樣對運算符進行時間評估,可以發現從數組取值所花時間明顯高於其他運算符。
所以:在算法設計時,不要忽略了一些簡單的行爲++ [] ==,這些操作需要開銷時間的。