免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7224 | 回复: 15
打印 上一主题 下一主题

perl for循环超慢,有没其它办法? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-03-14 23:52 |只看该作者 |倒序浏览
同样的一段程序,在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";
复制代码
一定要用perl的话,有其它办法能变快吗? 程序里for循环很多,而且有嵌套的,这种速度完全不行.

论坛徽章:
0
2 [报告]
发表于 2010-03-15 00:30 |只看该作者


用 Inline “C” ?

论坛徽章:
0
3 [报告]
发表于 2010-03-15 07:20 |只看该作者
用 Inline “C” ?
黑色阳光_cu 发表于 2010-03-15 00:30



谢谢. 我不了解inline C, 不过, 我的那个perl程序就3个类, 最多循环的操作是在其中一个类的函数里(这个函数还得调用其它类的函数),很难抽出来写一个单独的C程序. 估计用这个也不太现实.
没其它办法的话,估计得重新写个C++版的程序了,C++我一点也不熟,C更别提了 >.<

论坛徽章:
0
4 [报告]
发表于 2010-03-15 10:09 |只看该作者
同样的一段程序,在delphi中只要30ms,到perl中要3000ms一定要用perl的话,有其它办法能变快吗? 程序里for循环 ...
yisn 发表于 2010-03-14 23:52




如果数据交互设计较好的话(比如使用了关系数据库),那么可以用Perl的多进程(or maybe threads?)来并发的解决任务。

论坛徽章:
0
5 [报告]
发表于 2010-03-15 14:18 |只看该作者
回复 1# yisn


   
  1. foreach $i(1..37584806)
复制代码
foreach这后面的变量会被看成是一个列表。所以你这个的数据将会很大,导致你内存耗光。
像这么大的列表,建议使用循环代替。
  1. for(my $i=1,$i<=37584806;$i++)
复制代码
或者用while

论坛徽章:
0
6 [报告]
发表于 2010-03-15 14:40 |只看该作者
回复 5# toniz


    我测试的是 foreach 最快,for 其次,while 最慢。

论坛徽章:
0
7 [报告]
发表于 2010-03-15 14:47 |只看该作者
回复 6# longbow0


    证明你机器性能不错。  。 你可以试试把数字再调大,肯定会达到临界值的。

论坛徽章:
0
8 [报告]
发表于 2010-03-15 15:01 |只看该作者
Dual-Core AMD Opteron(tm) Processor 2214 HE

4 G DDR2 RAM

不算太好吧?

论坛徽章:
0
9 [报告]
发表于 2010-03-15 17:55 |只看该作者
回复 5# toniz


    我开始也以为是这样, 不过用while也是千ms级别的.

论坛徽章:
0
10 [报告]
发表于 2010-03-15 19:44 |只看该作者
回复 9# wind_ch


    是啊  你是对的  我也迷糊了 呵呵。
   发现foreach(1..1000000)这种方法是不会明显消耗内存的,如果把这个列表赋给数据,内存就立刻飙升。而直接用foreach的话内存就变化不大。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP