亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標(biāo)題: perl for循環(huán)超慢,有沒(méi)其它辦法? [打印本頁(yè)]

作者: yisn    時(shí)間: 2010-03-14 23:52
標(biāo)題: perl for循環(huán)超慢,有沒(méi)其它辦法?
同樣的一段程序,在delphi中只要30ms,到perl中要3000ms

  1. my $msec=time;
  2.     $middle=0;       
  3.         foreach $i(1..37584806) {
  4.           $middle++;
  5.         }

  6. my $msec2=time;
  7. print "loop for $middle times takes ",($msec2-$msec)*1000,"ms";
復(fù)制代碼
一定要用perl的話(huà),有其它辦法能變快嗎? 程序里for循環(huán)很多,而且有嵌套的,這種速度完全不行.
作者: 黑色陽(yáng)光_cu    時(shí)間: 2010-03-15 00:30


用 Inline “C” ?
作者: yisn    時(shí)間: 2010-03-15 07:20
用 Inline “C” ?
黑色陽(yáng)光_cu 發(fā)表于 2010-03-15 00:30



謝謝. 我不了解inline C, 不過(guò), 我的那個(gè)perl程序就3個(gè)類(lèi), 最多循環(huán)的操作是在其中一個(gè)類(lèi)的函數(shù)里(這個(gè)函數(shù)還得調(diào)用其它類(lèi)的函數(shù)),很難抽出來(lái)寫(xiě)一個(gè)單獨(dú)的C程序. 估計(jì)用這個(gè)也不太現(xiàn)實(shí).
沒(méi)其它辦法的話(huà),估計(jì)得重新寫(xiě)個(gè)C++版的程序了,C++我一點(diǎn)也不熟,C更別提了 >.<
作者: 蘭花仙子    時(shí)間: 2010-03-15 10:09
同樣的一段程序,在delphi中只要30ms,到perl中要3000ms一定要用perl的話(huà),有其它辦法能變快嗎? 程序里for循環(huán) ...
yisn 發(fā)表于 2010-03-14 23:52




如果數(shù)據(jù)交互設(shè)計(jì)較好的話(huà)(比如使用了關(guān)系數(shù)據(jù)庫(kù)),那么可以用Perl的多進(jìn)程(or maybe threads?)來(lái)并發(fā)的解決任務(wù)。
作者: toniz    時(shí)間: 2010-03-15 14:18
回復(fù) 1# yisn


   
  1. foreach $i(1..37584806)
復(fù)制代碼
foreach這后面的變量會(huì)被看成是一個(gè)列表。所以你這個(gè)的數(shù)據(jù)將會(huì)很大,導(dǎo)致你內(nèi)存耗光。
像這么大的列表,建議使用循環(huán)代替。
  1. for(my $i=1,$i<=37584806;$i++)
復(fù)制代碼
或者用while
作者: longbow0    時(shí)間: 2010-03-15 14:40
回復(fù) 5# toniz


    我測(cè)試的是 foreach 最快,for 其次,while 最慢。
作者: toniz    時(shí)間: 2010-03-15 14:47
回復(fù) 6# longbow0


    證明你機(jī)器性能不錯(cuò)。  。 你可以試試把數(shù)字再調(diào)大,肯定會(huì)達(dá)到臨界值的。
作者: longbow0    時(shí)間: 2010-03-15 15:01
Dual-Core AMD Opteron(tm) Processor 2214 HE

4 G DDR2 RAM

不算太好吧?
作者: wind_ch    時(shí)間: 2010-03-15 17:55
回復(fù) 5# toniz


    我開(kāi)始也以為是這樣, 不過(guò)用while也是千ms級(jí)別的.
作者: toniz    時(shí)間: 2010-03-15 19:44
回復(fù) 9# wind_ch


    是啊  你是對(duì)的  我也迷糊了 呵呵。
   發(fā)現(xiàn)foreach(1..1000000)這種方法是不會(huì)明顯消耗內(nèi)存的,如果把這個(gè)列表賦給數(shù)據(jù),內(nèi)存就立刻飆升。而直接用foreach的話(huà)內(nèi)存就變化不大。
作者: yybmsrs    時(shí)間: 2010-03-15 19:57
foreach(1..1000000)也應(yīng)該跟for差不多吧,每次加1,然后判斷

我這里測(cè)試foreach是19000ms,for是16000ms
作者: toniz    時(shí)間: 2010-03-15 20:21
回復(fù) 11# yybmsrs


    越來(lái)越迷糊 呵呵
  1. foreach $i(1..37584806){
  2. ...
  3. }
  4. 內(nèi)存基本看不到變化。
復(fù)制代碼
  1. @a=(1..37584806);
  2. foreach $i(@a){
  3. 。。。
  4. }
  5. 會(huì)消耗很多內(nèi)存。
復(fù)制代碼
  1. $i=(1..37584806)[37584800];
  2. 這樣也很耗內(nèi)存。
復(fù)制代碼

作者: yisn    時(shí)間: 2010-03-15 22:18
回復(fù)  yisn


    foreach這后面的變量會(huì)被看成是一個(gè)列表。所以你這個(gè)的數(shù)據(jù)將會(huì)很大,導(dǎo)致你內(nèi) ...
toniz 發(fā)表于 2010-03-15 14:18



變成while省不了太多時(shí)間, 之前測(cè)過(guò),for,foreach,while(甚至更慢)差不多. 如果用for(i;i++)的方式就慢得多.
作者: yisn    時(shí)間: 2010-03-15 22:21
如果數(shù)據(jù)交互設(shè)計(jì)較好的話(huà)(比如使用了關(guān)系數(shù)據(jù)庫(kù)),那么可以用Perl的多進(jìn)程(or maybe threads?) ...
蘭花仙子 發(fā)表于 2010-03-15 10:09


這個(gè)程序不是單純的讀大量數(shù)據(jù),操作大量數(shù)據(jù),它里面有用HMM算法,所以很難簡(jiǎn)單地變成數(shù)據(jù)庫(kù)的操作.
看來(lái)我還是變C++好了,希望能快一些. 反正對(duì)pl對(duì)C++都是小小菜菜鳥(niǎo) =.-
作者: wfnh    時(shí)間: 2010-03-15 22:57
看來(lái)你只能轉(zhuǎn)其他了·
作者: xmature    時(shí)間: 2010-03-16 23:37
{:3_185:}




歡迎光臨 Chinaunix (http://72891.cn/) Powered by Discuz! X3.2