LC_ALL=en_US.UTF-8 让 awk 慢了 40 倍!

  无意中发现,在一台服务器上,非常简单的awk程序,比C的等价物要慢40倍,感觉有点不太正常,还以为的确是awk太慢。不得其解,到另一台服务上试了一下,相同的 awk 程序,相同的测试数据,这台服务器的速度与C相当,也就是说,同样是awk,两台机器速度差了 40倍,而两台机器配置基本相当。非常困惑,找了两小时的原因,终于发现gawk手册里面有一段话:

For other single-character record separators, using ‘LC_ALL=C’will give you much better performance when reading records. Otherwise,gawk has to make several function calls, per inputcharacter to find the record terminator.

再看两台机器的 locale,结果发现,慢的机器上:

[root@slow-server]# locale
LANG=en_US.UTF-8
LC_XXXX=en_US.UTF-8

...
LC_ALL=en_US.UTF-8

快的机器上:

[root@fast-server]# locale
LANG=en_US
LC_XXXX=en_US

...
LC_ALL=   <空>

马上试验,将slow-server的locale改掉:

export LC_ALL=C

速度马上快了40倍,与fast-server相当。

 

这应该是awk实现上的一个缺陷,即便是对utf8,也不应该慢这么多,如果缓冲合适,最多慢2~3倍就可以了,为什么非要gawk has to make several function calls, per inputcharacter

©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值