[問題] 請教各位大大,為何迴圈會越跑越慢

作者: baconcsie (Bacon)   2016-11-28 20:57:56
各位大大,小弟我最近在寫一支程式
是針對一個 "物件陣列"做循序的條件比對,物件陣列數約莫24萬個
比對的參數有8種a, b, c, d,.....h
比對方式像是這樣,
先比較 物件[0].value >= a,如果是就要去做某個數值計算
再比較 物件[0].value <= b,如果是就去做另一個數值計算
最後每一組參數都會得到一個結果R,紀錄起來後,再運算下一組參數
所以我寫了一個迴圈像是以下這樣
for(int a=0.4 ; a<0.9 ; a+=0.1){
  for(int b=0.4 ; b<0.9 ; b+=0.1 ){
........(好幾層迴圈)
for(int h=1.0 ; h<1.5 ; h+=0.1){
//計算完結果,寫入記事本
fileWriter.write(test(物件陣列, a, b, c,..., h)+"\r\n");
}
}
}
test函數,會把物件陣列循序的提出來,進行比對,然後把結果寫入記事本
最一開始做一次,大概要5~6秒的時間,但是越到後來,速度越慢,到了60幾秒做一次,
我每完成一個參數比對都有把全域變數=null掉,並呼叫gc(),僅留下那個物件陣列沒
釋放,因為要一直對他做比對,除此之外,跑這個大量回圈比對時。
我是另外呼叫一個SwingWorker,在背景中做算算,僅僅一個,沒用到多Thread,
我估狗過了,但幾乎都是在講多執行緒的問題,但我除了GUI的Thread,僅多一條而以,
請問有各位高手大大有什麼想法嗎...或是直接知道是怎麼回事...
另外我想問 StringBuilder的問題,到現在1.8還是依舊嗎?還是說有修正了?
作者: cug990617 (CUG)   2016-11-28 21:45:00
你的for迴圈全部分開吧,綁在一起會是倍數成長,效能很差
作者: baconcsie (Bacon)   2016-11-28 22:01:00
不太了解大大的意思,通通綁在一起跑,為何會影響效能?因為要測遍所有的參數組合,才會這樣寫...
作者: pttworld (批踢踢世界)   2016-11-28 23:24:00
可稱為條件就是如果if這的,還可以配邏輯運算子。
作者: cug990617 (CUG)   2016-11-29 00:53:00
抱歉,看錯,誤會意思,請忽略我上面說的。另外是否要輸出的值過多堆積在記憶體裡,可嘗試flush看看是否能改善。
作者: LaPass (LaPass)   2016-11-29 09:51:00
int a=0.4 ???? java不能這樣寫吧?還有,妳這個到底是在算什麼東西?把問題完整的講出來,有時候直接換一套演算法可以加速好多倍
作者: KekeMonster (KekeMonster)   2016-11-29 10:08:00
有試過把gc()拿掉嗎?感覺你花在gc的時間比運算還多
作者: ssccg (23)   2016-11-29 10:15:00
重點是你的記算內容,數值計算都用primitive type、local變數的話,為什麼要gc?
作者: gmoz ( This can't do that. )   2016-11-29 11:08:00
該不會變成超大的笛卡兒積吧是不是有變數沒RESET阿你的運算應該也就24X8= 190萬次左右的運算吧放個count看看跑了幾次?沒看仔細 不只190萬.. 我覺得先加COUNT吧 自己先估計一下你有看一下跑的時候記憶體吃多少嗎
作者: riddlefree (一劍十年)   2016-11-29 11:39:00
你的程式和你描述的邏輯不太合
作者: lucky1lk (賭到沒錢的人)   2016-11-29 12:47:00
你的程式有跑完的一天嗎@@ 你的型別怪怪der
作者: baconcsie (Bacon)   2016-11-29 16:04:00
記憶體吃的不多幾G而已,變數每完成一次最小迴圈都會null一次
作者: ripple0129 (perry tsai)   2016-11-29 16:14:00
先單元化吧,別把全部邏輯塞一堆
作者: gmoz ( This can't do that. )   2016-11-29 17:31:00
話說你的"一開始做一次"是什麼意思 最內圈迴圈?
作者: baconcsie (Bacon)   2016-11-30 02:04:00
是的 最內迴圈 做一次test,要5~6秒
作者: gmoz ( This can't do that. )   2016-11-30 11:46:00
內層迴圈5秒 第二層 n次跑5*n秒 第三層m次跑5*n*m秒 正常吧還是內層迴圈越來越慢(?
作者: baconcsie (Bacon)   2016-11-30 17:16:00
對 最內層的test每執行一次的完成時間,越來越久
作者: gmoz ( This can't do that. )   2016-12-01 14:22:00
換電腦或換個OS跑跑看?Jconsole?
作者: twntwn   2016-12-04 23:10:00
看看你是不是IO Bound呀

Links booklink

Contact Us: admin [ a t ] ucptt.com