2015年11月4日 星期三

[雜談]程式效能(一)

前幾天在FB上看到有大學生在某社團問作業:1加到10的程式怎麼做
然後看到一些很有趣的解答
剛好趁機談談程式的效能
由1加到n這個運算
很直觀的做法就是1+2+3+4+5+6.+..+n
用for迴圈表示就是i=1到n,result= result+i;
但是這樣你數字越大他要跑的迴圈就越常
同樣的計算結果你用高斯方法就是n*(n+1)/2
不管你的n有多大,程式永遠做一次加法,一次乘法,一次除法
這就是所謂好的演算法
那對效能有什麼影響呢,以下我們拿這個範例程式
第一個呼叫的是for迴圈的方法
第二個呼叫的是高斯方法
我使用了結果程式的時間減掉程式開始時間來計算每一個方法使用了多少毫秒
程式碼如下


import java.util.Date;



public class SumTest {



 public static void main(String[] args) {

  

  useForLoop(10000000);

  useGaussMethod(10000000);

 }



 public static void useForLoop(long input){

  long result = 0;

  long startTime = new Date().getTime();

  for(long i = 1;i<=input;i++){

   result = result + i;

  }

  System.out.println(result);

  long endTime = new Date().getTime();

  long totalTime = endTime-startTime;

  System.out.println(totalTime);

 }

 

 public static void useGaussMethod(long input){

  long startTime = new Date().getTime();

  long result = input*(input+1)/2;

  System.out.println(result);

  long endTime = new Date().getTime();

  long totalTime = endTime-startTime;

  System.out.println(totalTime);

 }

 

}



然後實驗開始啦,首先是n等於一萬
看起來兩個花的時間都是0毫秒沒什麼差別,於是我將n值放大到十萬
似乎有點差別了,不過可能是誤差,再放大n到100萬看看

差距來到了三毫秒,最後我們再放大n到1000萬
for回圈的消耗時間增加到了25毫秒
所以我們可以知道
在資料量小的時候,我們不一定能感覺出演算法的好壞
但是好的演算法在輸入的值越大的時候,節省的效能會越明顯
雖然一般來講先完成功能就好,但是當功能完成之後應該要去思考如何提升程式效能提高使用品質

之後會不會繼續這個主題就看我有沒有時間囉~_~+

沒有留言:

張貼留言