2015年11月14日 星期六

Delphi的for迴圈很慢嗎?

有Delphi同好提出一個問題,要計算C(39,5)這種階層的計算,並產生出排列組合的結果。這部分用遞迴或用迴圈來做都可以達到目標。他的問題在產生這些資料太慢了。以上述的計算,會產生37萬筆左右的資料,大約要八分鐘,太慢了,如下圖。
筆者覺得這應該有改善的空間,以前在學生時代寫程式交作業時,這種計算大約五分鐘就出來了,怎麼可能經過那麼多年,CPU都改了幾個世代了,這種數值的計算反而會花的時間更多?
於是筆者要了程式看了一下,加了二行程式,結果如下:
時間變成一分多,為什麼?

  Memo1.Visible := False;
  // 開始時間
  stime := now;
...
...遞迴程式
...
  // 結束時間
  etime := now;
  // 顯示計算時間和產生的數量
  Label1.Caption := '時間: '+FloatToStr(Trunc((etime-stime)*24*60*1000+0.5)/1000)+' 分';
  Label2.Caption := '數量: '+IntToStr(Memo1.Lines.Count);
  Memo1.Visible := True;

紅色是筆者加上的程式,主要的目的在計算過程中,不要讓Memo一直做資料的顯示,等到全部的資料做完,再一次顯示。時間就差了八倍。

Delphi的for迴圈其實是很快的,重點是在迴圈讓Delphie專注做它要做的工作。