免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: ly5066113
打印 上一主题 下一主题

perl为什么会比awk慢?(已解决) [复制链接]

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
11 [报告]
发表于 2008-01-23 14:07 |只看该作者
原帖由 flw 于 2008-1-23 13:54 发表

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


有呀,脚本在5楼贴出来了,==换成了eq,并且先执行的awk命令。

论坛徽章:
0
12 [报告]
发表于 2008-01-23 16:33 |只看该作者
这样就没啥可比性了。
首先awk 本身就是基于行和域的工具,在这方面是专职工具,显然是优化过的

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

论坛徽章:
0
13 [报告]
发表于 2008-01-23 16:41 |只看该作者

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


  1. time awk '{split($0,a,"\\|\\|");if(a[2]== " 0300530002 ")print $0}' file > tmp1

复制代码

论坛徽章:
0
14 [报告]
发表于 2008-01-23 19:12 |只看该作者
对多cpu支持不好吧

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
15 [报告]
发表于 2008-01-24 11:24 |只看该作者
原帖由 davistar 于 2008-1-23 16:33 发表
这样就没啥可比性了。
首先awk 本身就是基于行和域的工具,在这方面是专职工具,显然是优化过的

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


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

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
16 [报告]
发表于 2008-01-24 11:47 |只看该作者
原帖由 ly5066113 于 2008-1-24 11:24 发表

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

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

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

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
17 [报告]
发表于 2008-01-24 12:52 |只看该作者
原帖由 flw 于 2008-1-24 11:47 发表

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


恩,老大的完全可以。
对(?:.*?\|\|.*?)这里的?:不理解,是什么固定语法吧。
我测试去掉?:,(.*?\|\|.*?)也是可以的。
而我自己写的是这样的,([^|]*\|\|[^|]*)也是可以的。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
18 [报告]
发表于 2008-01-24 13:15 |只看该作者
?: 表示只聚簇,不捕获。大骆驼中有讲,建议抽空把那本书看完,你会大有收获。我当时是花了一个月草草看完的。尤其前几章,对加深基本概念的理解非常有帮助。

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
19 [报告]
发表于 2008-01-24 13:25 |只看该作者
原帖由 flw 于 2008-1-24 13:15 发表
?: 表示只聚簇,不捕获。大骆驼中有讲,建议抽空把那本书看完,你会大有收获。我当时是花了一个月草草看完的。尤其前几章,对加深基本概念的理解非常有帮助。


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

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
20 [报告]
发表于 2008-01-24 13:30 |只看该作者
原帖由 ly5066113 于 2008-1-24 13:25 发表

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

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP