精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-01-29
最后修改:2010-01-29
无意中发现,在一台服务器上,非常简单的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 input character to find the record terminator. 在看两台机器的 locale,结果发现,慢的机器上: [root@slow-server]# locale ... 快的机器上: [root@fast-server]# locale ... 马上试验,将slow-server的locale改掉: export LC_ALL=C 速度马上快了40倍,与fast-server相当。
这应该是awk实现上的一个缺陷,即便是对utf8,也不应该慢这么多,如果缓冲合适,最多慢2~3倍就可以了,为什么非要gawk has to make several function calls, per input character ?
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-01-30
个人猜测。
utf8是流解码,下标访问要O(n) |
|
返回顶楼 | |
发表时间:2010-02-01
可以把utf8转化成utf32,就可以在缓冲区内随机访问任意字符了,而 iconv 的速度是非常快的。
|
|
返回顶楼 | |
浏览 3147 次