8

如果您能将获奖的 O'Rourke 的 Perl 解决方案Lundh 的 Python 解决方案进行比较,我将不胜感激,因为我对 Perl 的了解还不够好,无法理解那里发生了什么。更具体地说,我想知道是什么赋予了 Perl 版本 3x 的优势:算法优势、C 扩展的质量、其他因素?

宽查找器:结果

4

5 回答 5

10

perl 的更好的正则表达式实现是故事的一部分。然而,这无法解释为什么 perl 实现可以更好地扩展。处理器越多,差异越大。由于某种原因,python 实现在那里存在问题。

于 2008-09-23T22:39:07.550 回答
5

Perl 针对文本处理进行了大量优化。有很多因素,很难说确切的区别是什么。文本在内部表示完全不同(utf-8 与 utf-16/utf-32),正则表达式引擎也完全不同。Python 的正则表达式引擎是一个自定义的引擎,不如 perl 的那么常用。与基本上是“语言核心”的 Perl 相比,很少有开发人员致力于它(我认为它基本上没有维护)。

毕竟 Perl 是文本处理语言。

于 2008-09-23T22:14:18.200 回答
3

Many-core Engine (MCE) has been released for Perl. MCE does quite well at this, even when reading directly from disk with 8 workers (cold cache). Compare to wf_mmap. MCE follows a bank queuing model when reading input data. Look under the images folder for slides on it.

The source code is hosted at http://code.google.com/p/many-core-engine-perl/

The perl documentation can be read at https://metacpan.org/module/MCE

An implementation of the Wide Finder with MCE is provided under examples/tbray/

https://metacpan.org/source/MARIOROY/MCE-1.514/examples/tbray/

Enjoy 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
于 2012-11-09T00:28:26.927 回答
1

Perl 实现使用mmap系统调用。该调用所做的是建立一个指向进程的指针,该指针似乎是程序的正常内存段或缓冲区。它将文件的内容映射到内存区域。与普通文件 IO(读取)相比,这样做有性能优势——一个是不需要用户空间库调用来访问数据,另一个是通常需要较少的复制操作(例如:在内核和用户空间)。

Perl 的字符串和正则表达式是基于 8 位字节的(例如与 Java 的 utf16 相反),因此 Perl 的本机“字符类型”与映射文件的编码相同。

当正则表达式引擎对 mmap 支持的变量进行操作时,它通过映射的内存区域直接访问文件数据——无需通过 Perl 的 IO 函数,甚至 libc 的 IO 函数。

mmap 可能主要负责与使用普通 Python IO 库的 Python 版本的性能差异——这还引入了寻找换行符的开销。

Perl 程序还支持 -J 来并行处理,其中 oepen "-|" 导致一个 fork() ,其中父级中的文件句柄指向子级的标准输出。子进程将其结果序列化到标准输出,父进程将它们反序列化以协调和汇总结果。

于 2008-09-25T17:47:10.713 回答
0

Perl 实现使用 mmap 系统调用。

这个。它避免了缓冲区复制并提供异步 I/O。

于 2009-12-02T07:12:44.030 回答