如果您能将获胜的 O’Rourke 的 Perl 解决方案 与 Lundh 的 Python 解决方案 进行比较,我将非常感激,因为我对 Perl 的了解还不足以理解那里发生的事情。更具体地说,我想知道是什么给了 Perl 版本 3x 的优势:算法优越性、C 扩展的质量、其他因素?
Perl 更好的正则表达式实现是故事的一部分。但这无法解释为什么 perl 实现具有更好的扩展性。处理器越多,差异就越大。由于某种原因,Python 实现存在问题。
Perl 针对文本处理进行了大量优化。因素太多,很难说清楚到底有什么区别。文本在内部的表示方式完全不同(utf-8 与 utf-16/utf-32),正则表达式引擎也完全不同。 Python 的正则表达式引擎是一种自定义引擎,使用率不如 Perl 引擎那么多。与 Perl 相比,很少有开发人员致力于它(我认为它基本上是无人维护的),Perl 基本上是“语言的核心”。
毕竟 Perl 是文本处理语言。
Perl 的众核引擎 (MCE) 已发布。即使在使用 8 个工作线程(冷缓存)直接从磁盘读取时,MCE 在这方面也做得很好。与 wf_mmap 进行比较。 MCE 在读取输入数据时遵循组排队模型。在图像文件夹下查找其中的幻灯片。
源代码托管在 http://code.google.com/p/many-core-engine-perl/
perl 文档可以在 https://metacpan.org/module/MCE
阅读示例/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
Perl 实现使用 mmap 系统调用。该调用的作用是建立一个指针,对于进程来说,该指针似乎是程序的正常内存段或缓冲区。它将文件的内容映射到内存区域。与普通文件 IO(读取)相比,这样做有性能优势 - 一是访问数据不需要用户空间库调用,另一个是通常需要较少的复制操作(例如:在之间移动数据)内核和用户空间)。
Perl 的字符串和正则表达式是基于 8 位字节的(例如,与 Java 的 utf16 不同),因此 Perl 的本机“字符类型”与映射文件的编码相同。
当正则表达式引擎对 mmap 支持的变量进行操作时,它会通过映射的内存区域直接访问文件数据 - 无需通过 Perl 的 IO 函数,甚至 libc 的 IO 函数。
mmap 可能在很大程度上导致了与使用普通 Python IO 库的 Python 版本相比的性能差异 - 这还额外引入了寻找换行符的开销。
Perl 程序还支持 -J 来并行处理,其中 oepen“-|”导致 fork() ,其中父级中的文件句柄指向子级的标准输出。子进程将其结果序列化到标准输出,父进程将其反序列化以协调和汇总结果。
Perl 实现使用 mmap 系统调用。
这个。它避免了缓冲区复制并提供异步 I/O。