[问题] 请教各位大大,为何循环会越跑越慢

楼主: 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