如果你能将胜利O’Rourke's Perl solution与Lundh's Python solution进行比较,我将非常感激,因为我不知道Perl是否足以理解那里发生了什么。更具体地说,我想知道是什么赋予了Perl版本3x的优势:算法优势,C扩展的质量,其他因素?
答案 0 :(得分:10)
perl更好的正则表达式实现是故事的一部分。然而,这无法解释为什么perl实现更好地扩展。随着处理器越多,差异越大。由于某种原因,python实现存在问题。
答案 1 :(得分:5)
Perl针对文本处理进行了大量优化。有很多因素很难说出确切的区别。文本在内部完全不同(utf-8与utf-16 / utf-32),正则表达式引擎也完全不同。 Python的正则表达式引擎是一个自定义引擎,并没有像perl那样多。很少有开发人员在研究它(我认为它基本上没有维护),而Perl基本上是“语言的核心”。
毕竟Perl是 文本处理语言。
答案 2 :(得分:3)
许多核心引擎(MCE)已经发布用于Perl。 MCE在这方面表现相当不错,即使直接从具有8名工作人员的磁盘读取(冷缓存)也是如此。与wf_mmap比较。在读取输入数据时,MCE遵循银行排队模型。在images文件夹下查看幻灯片。
源代码托管在http://code.google.com/p/many-core-engine-perl/
可以在https://metacpan.org/module/MCE
上阅读perl文档在examples / tbray /
下提供了带有MCE的Wide Finder的实现https://metacpan.org/source/MARIOROY/MCE-1.514/examples/tbray/
享受MCE。
Script....: baseline1 baseline2 wf_mce1 wf_mce2 wf_mce3 wf_mmap
Cold cache: 1.674 1.370 1.252 1.182 1.174 3.056
Warm cache: 1.236 0.923 0.277 0.106 0.098 0.092
答案 3 :(得分:1)
Perl实现使用mmap系统调用。该调用的作用是建立一个指针,该指针对进程来说似乎是程序的正常内存段或缓冲区。它将文件的内容映射到内存区域。执行此操作与正常文件IO(读取)相比具有性能优势 - 一个是不需要用户空间库调用来访问数据,另一个是通常需要更少的复制操作(例如:在两者之间移动数据)内核和用户空间)。
Perl的字符串和正则表达式是基于8位字节的(例如,与Java的utf16相反),因此Perl的本机“字符类型”与mmapped文件的编码相同。
当正则表达式引擎对mmap支持的变量进行操作时,它通过mamped内存区域直接访问文件数据 - 无需通过Perl的IO函数,甚至libc的IO函数。
与使用普通Python IO库的Python版本相比,mmap可能主要负责性能差异 - 这还会增加寻找换行符的开销。
Perl程序还支持-J来并行处理,其中oepen“ - |”导致fork(),其中父项中的文件句柄是子项的标准输出。子进程将其结果序列化为stdout,父对它们进行反序列化以协调和汇总结果。
答案 4 :(得分:0)
Perl实现使用mmap系统调用。
此。它避免了缓冲区复制并提供异步I / O.