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

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

一个很简单的文本处理:
每条记录都是以||分割的,判断它的第9个域是“ 0300530002 ”,就输出到一个新的文件。
写了个脚本,测试perl和awk的速度:
#!/bin/sh
echo "perl start"
echo $(date "+%F %T")
perl -F'\|\|' -ane 'print if $F[8] == " 0300530002 "' file1 > tmp1
echo "perl end"
echo $(date "+%F %T")

echo "awk start"
echo $(date "+%F %T")
awk -F'\\|\\|' '$9==" 0300530002 "' file1 > tmp2
echo "awk end"
echo $(date "+%F %T")

结果如下:
perl start
2008-01-22 18:57:07
perl end
2008-01-22 19:33:40
awk start
2008-01-22 19:33:40
awk end
2008-01-22 19:51:40

整整慢了一倍,为什么会这样呢?

慢很正常。
另外,你可以把 == 改成 eq 试一下。
还有啊,你把两个语句反过来执行一下,先执行 awk,再执行 perl 试试。

顺便说一句,测试时间应该用 time 命令,更好一些。
好的,我试试。
因为文本处理是perl的强项,所以我一直认为perl会快一点,至少也不会比awk慢。
#!/bin/sh
time awk -F'\\|\\|' '$9==" 0300530002 "' file1 > tmp1
time perl -F'\|\|' -ane 'print if $F[8] eq " 0300530002 "' file1 > tmp2

real    17m49.99s
user    16m35.93s
sys     1m3.58s

real    35m48.98s
user    34m32.96s
sys     1m4.18s

为什么还是这样呢?慢了整整一倍。


QUOTE:
原帖由 ly5066113 于 2008-1-23 11:18 发表
好的,我试试。
因为文本处理是perl的强项,所以我一直认为perl会快一点,至少也不会比awk慢。

awk是C编译好的, 而perl....

"强大" ne "快"
用perlcc 编译一下..会更快一点...

但是这样比好像没有什麽意思....

要更快..请用C..谢谢..
个人觉得,考虑到速度的话,如果能用awk完成的,尽量用awk。 觉得awk毕竟是直接调用内部命令,而perl需要interpreter 转一下。
上面的测试是用15G左右的文件测试的。

我又用10G左右的文件测试了一下:
real    12m10.79s
user    11m3.70s
sys     0m53.69s

real    25m1.80s
user    23m57.77s
sys     0m54.26s

还是2倍的关系。
每次都正好慢一倍,我感觉应该是哪里有些问题。
貌似运行awk命令的时候,有2个CPU在忙,而运行perl的时候,只有1个CPU在忙。
我的环境是AIX 5.3,perl是5.8.2。
我有没有什么办法,在运行perl的时候让它多用点资源呢?


QUOTE:
原帖由 ly5066113 于 2008-1-23 13:30 发表
上面的测试是用15G左右的文件测试的。

我又用10G左右的文件测试了一下:
real    12m10.79s
user    11m3.70s
sys     0m53.69s

real    25m1.80s
user    23m57.77s
sys     0m54.26s

还是2倍的 ...

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