perl为什么会比awk慢?(已解决)



QUOTE:
原帖由 flw 于 2008-1-23 13:54 发表

你有没有按照我说的测试一下?

有呀,脚本在5楼贴出来了,==换成了eq,并且先执行的awk命令。
这样就没啥可比性了。
首先awk 本身就是基于行和域的工具,在这方面是专职工具,显然是优化过的

而perl虽说文本处理强大,但是每行都整个数组,谁也够呛阿 呵呵

如果你把awk这样写 ,perl就快了

[Copy to clipboard] [ - ]
CODE:
time awk '{split($0,a,"\\|\\|");if(a[2]== " 0300530002 ")print $0}' file > tmp1

对多cpu支持不好吧


QUOTE:
原帖由 davistar 于 2008-1-23 16:33 发表
这样就没啥可比性了。
首先awk 本身就是基于行和域的工具,在这方面是专职工具,显然是优化过的

而perl虽说文本处理强大,但是每行都整个数组,谁也够呛阿 呵呵

davistar兄说的对,-a参数是影响性能的关键。
perl -ne 'print if / 0300530002 /' file1 > tmp2
直接这样写,只需要5分钟,虽然不是精确匹配。


QUOTE:
原帖由 ly5066113 于 2008-1-24 11:24 发表

davistar兄说的对,-a参数是影响性能的关键。
perl -ne 'print if / 0300530002 /' file1 > tmp2
直接这样写,只需要5分钟,虽然不是精确匹配。

-a 造成的数据拷贝以及内存分配的开销太大了。
正则表达式的确是一个很好的思路,要想精确匹配,你可以改一下正则表达式:

[Copy to clipboard] [ - ]
CODE:
/^(?:.*?\|\|.*?){8} 0300530002 /

测试一下,我没数据,没验证。


QUOTE:
原帖由 flw 于 2008-1-24 11:47 发表

-a 造成的数据拷贝以及内存分配的开销太大了。
正则表达式的确是一个很好的思路,要想精确匹配,你可以改一下正则表达式:
/^(?:.*?\|\|.*?){8} 0300530002 /
测试一下,我没数据,没验证。

恩,老大的完全可以。
对(?:.*?\|\|.*?)这里的?:不理解,是什么固定语法吧。
我测试去掉?:,(.*?\|\|.*?)也是可以的。
而我自己写的是这样的,([^|]*\|\|[^|]*)也是可以的。
?: 表示只聚簇,不捕获。大骆驼中有讲,建议抽空把那本书看完,你会大有收获。我当时是花了一个月草草看完的。尤其前几章,对加深基本概念的理解非常有帮助。


QUOTE:
原帖由 flw 于 2008-1-24 13:15 发表
?: 表示只聚簇,不捕获。大骆驼中有讲,建议抽空把那本书看完,你会大有收获。我当时是花了一个月草草看完的。尤其前几章,对加深基本概念的理解非常有帮助。

恩,谢谢老大。
貌似大骆驼只有英文版的,看起来费劲。记得你说过可以按:小骆驼-->24小时-->大骆驼的顺序看。
我还是先看前两个吧,都有中文版的。


QUOTE:
原帖由 ly5066113 于 2008-1-24 13:25 发表

恩,谢谢老大。
貌似大骆驼只有英文版的,看起来费劲。记得你说过可以按:小骆驼-->24小时-->大骆驼的顺序看。
我还是先看前两个吧,都有中文版的。

你记错了。24 小时那个,我不建议看,写得很差,外行人写的。
应该是小骆驼、黑豹书、大骆驼。
大骆驼中文版本版精华区就有。
我和大大狗都发过。名字叫《Perl 语言编程》