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

看板java作者 (Bacon)時間7年前 (2016/11/28 20:57), 7年前編輯推噓6(6028)
留言34則, 12人參與, 最新討論串1/1
各位大大,小弟我最近在寫一支程式 是針對一個 "物件陣列"做循序的條件比對,物件陣列數約莫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還是依舊嗎?還是說有修正了? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.241.138.246 ※ 文章網址: https://www.ptt.cc/bbs/java/M.1480337878.A.20D.html ※ 編輯: baconcsie (123.241.138.246), 11/28/2016 21:06:24

11/28 21:45, , 1F
你的for迴圈全部分開吧,綁在一起會是倍數成長,效能很
11/28 21:45, 1F

11/28 21:45, , 2F
11/28 21:45, 2F

11/28 22:01, , 3F
不太了解大大的意思,通通綁在一起跑,為何會影響效能?
11/28 22:01, 3F

11/28 22:02, , 4F
因為要測遍所有的參數組合,才會這樣寫...
11/28 22:02, 4F

11/28 23:24, , 5F
可稱為條件就是如果if這的,還可以配邏輯運算子。
11/28 23:24, 5F

11/29 00:53, , 6F
抱歉,看錯,誤會意思,請忽略我上面說的。
11/29 00:53, 6F

11/29 00:53, , 7F
另外是否要輸出的值過多堆積在記憶體裡,可嘗試flush看
11/29 00:53, 7F

11/29 00:53, , 8F
看是否能改善。
11/29 00:53, 8F

11/29 09:51, , 9F
int a=0.4 ???? java不能這樣寫吧?
11/29 09:51, 9F

11/29 09:52, , 10F
還有,妳這個到底是在算什麼東西?把問題完整的講出來,有
11/29 09:52, 10F

11/29 09:52, , 11F
時候直接換一套演算法可以加速好多倍
11/29 09:52, 11F

11/29 10:08, , 12F
有試過把gc()拿掉嗎?感覺你花在gc的時間比運算還多
11/29 10:08, 12F

11/29 10:15, , 13F
重點是你的記算內容,數值計算都用primitive type、local
11/29 10:15, 13F

11/29 10:16, , 14F
變數的話,為什麼要gc?
11/29 10:16, 14F

11/29 11:08, , 15F
該不會變成超大的笛卡兒積吧
11/29 11:08, 15F

11/29 11:08, , 16F
是不是有變數沒RESET阿
11/29 11:08, 16F

11/29 11:09, , 17F
你的運算應該也就24X8= 190萬次左右的運算吧
11/29 11:09, 17F

11/29 11:10, , 18F
放個count看看跑了幾次?
11/29 11:10, 18F

11/29 11:15, , 19F
沒看仔細 不只190萬.. 我覺得先加COUNT吧 自己先估計一下
11/29 11:15, 19F

11/29 11:17, , 20F
你有看一下跑的時候記憶體吃多少嗎
11/29 11:17, 20F

11/29 11:39, , 21F
你的程式和你描述的邏輯不太合
11/29 11:39, 21F

11/29 12:47, , 22F
你的程式有跑完的一天嗎@@ 你的型別怪怪der
11/29 12:47, 22F

11/29 16:04, , 23F
記憶體吃的不多幾G而已,變數每完成一次最小迴圈都會nu
11/29 16:04, 23F

11/29 16:04, , 24F
ll一次
11/29 16:04, 24F

11/29 16:14, , 25F
先單元化吧,別把全部邏輯塞一堆
11/29 16:14, 25F

11/29 17:31, , 26F
話說你的"一開始做一次"是什麼意思 最內圈迴圈?
11/29 17:31, 26F

11/30 02:04, , 27F
是的 最內迴圈 做一次test,要5~6秒
11/30 02:04, 27F

11/30 11:46, , 28F
內層迴圈5秒 第二層 n次跑5*n秒 第三層m次跑5*n*m秒 正常吧
11/30 11:46, 28F

11/30 11:47, , 29F
還是內層迴圈越來越慢(?
11/30 11:47, 29F

11/30 17:16, , 30F
對 最內層的test每執行一次的完成時間,越來越久
11/30 17:16, 30F

12/01 14:22, , 31F
換電腦或換個OS跑跑看?
12/01 14:22, 31F

12/01 14:23, , 32F
Jconsole?
12/01 14:23, 32F

12/04 23:10, , 33F
看看你是不是IO Bound呀
12/04 23:10, 33F

01/13 08:06, , 34F
這為何不會compile error? int a = 0.4怎麼會動
01/13 08:06, 34F
文章代碼(AID): #1OF2dM8D (java)