【发布时间】:2010-09-12 13:21:20
【问题描述】:
如果您能将获胜的O’Rourke's Perl solution 与Lundh's Python solution 进行比较,我将非常感激,因为我对 Perl 的了解还不够好,无法理解那里发生了什么。更具体地说,我想知道是什么赋予了 Perl 版本 3 倍的优势:算法优势、C 扩展的质量,以及其他因素?
【问题讨论】:
标签: python performance perl analysis
如果您能将获胜的O’Rourke's Perl solution 与Lundh's Python solution 进行比较,我将非常感激,因为我对 Perl 的了解还不够好,无法理解那里发生了什么。更具体地说,我想知道是什么赋予了 Perl 版本 3 倍的优势:算法优势、C 扩展的质量,以及其他因素?
【问题讨论】:
标签: python performance perl analysis
perl 的更好的正则表达式实现是故事的一部分。然而,这无法解释为什么 perl 实现可以更好地扩展。处理器越多,差异越大。由于某种原因,python 实现存在问题。
【讨论】:
Perl 针对文本处理进行了高度优化。有很多因素,很难说确切的区别是什么。文本在内部表示完全不同(utf-8 与 utf-16/utf-32),正则表达式引擎也完全不同。 Python 的正则表达式引擎是一个自定义的引擎,不如 perl 的那么常用。与基本上是“语言核心”的 Perl 相比,很少有开发人员致力于它(我认为它基本上没有维护)。
毕竟 Perl 是 文本处理语言。
【讨论】:
已针对 Perl 发布了多核引擎 (MCE)。 MCE 在这方面做得很好,即使直接从具有 8 个工作人员的磁盘读取(冷缓存)也是如此。与 wf_mmap 进行比较。 MCE 在读取输入数据时遵循银行排队模型。查看图片文件夹下的幻灯片。
源代码托管在http://code.google.com/p/many-core-engine-perl/
perl 文档可以在https://metacpan.org/module/MCE阅读
在 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
【讨论】:
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。
【讨论】: