正则表达式引擎pcre使用JIT(即时编译)后比不使用速度快了好几倍(甚至10倍),为什么这么快?
原来就不慢,为什么还能提高这么多,哪方面提的速呢?
---把我下面的回复放上来,当作问题的补充---
因为pcre本身也是用c写的,并不是动态编译。我现在不明白的是它如何动态编译的,是分析二进制代码然后再重新编译?还是先运行一个虚拟机,再在上面跑,然后再分析?还有就是如何优化的?
最近一直再看pcre的源码(英文比较烂,看的慢,刚把未用JIT的代码看了个大概),觉得原来的代码并没有多少冗余,如果再打开c编译器的优化选项,觉得从代码本身来看并没有多大的优化余地,看了pcre的帮助文件也没说清楚原理,只说表达式里包含循环或者表达式越长用JIT的优化效果越明显,测试了确实如此。
再就是对这个比较感兴趣是也写过一个正则表达式引擎,速度和未用jit加速的pcre差不多,而且能优化的手段基本都用了,所以非常好奇jit是怎么优化的。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我的理解是,你对PCRE JIT的理解错了吧。JIT的不是PCRE自身的C代码,而是PCRE里面那个正则表达式虚拟机的中间代码。既然你写过正则表达式引擎,那应该知道Virtual Machine Approach(http://swtch.com/~rsc/regexp/regexp2.html)。PCRE就是这种方式,
执行
perl -e 'use re debug;/a|b/'
会输出如下ByteCode(又称MIR - Middle Level Representation):而VM执行需要这样:
JIT就是将这步省掉直接编译成机器码啊。尽管ByteCode已经够简单了,但这样执行仍然有免不了 switch、if这样的开销。将这此额外开销省掉大概能性能提升不少吧,剩下的只有read char和比较运算了。
在zhihu看到的
地址:
http://www.zhihu.com/question/19672491