我正在研究study,这是一个Perl特性,用于检查字符串,以使后续正则表达式可能更快:
while( <> ) {
study;
$count++ if /PATTERN/;
$count++ if /OTHER/;
$count++ if /PATTERN2/;
}
关于哪些情况会从中受益,我们没有太多的论述,您可以从the docs中梳理出以下几点:
- 具有常量字符串的模式
- 多种模式
- 目标字符串越短越好(学习时间越少)
我在寻找一些具体的案例,不仅可以证明它有很大的优势,还可以稍微调整一下,使其失去优势。the docs中的一个警告是,你应该对个别案例进行基准测试。我想找到一些边缘案例,在这些案例中,字符串(或模式)的微小差异会导致性能的巨大差异。
如果你没有使用过study,请不要回答。我宁愿得到格式正确的答案,而不是快速的猜测。这里没有紧急情况,也没有耽误任何工作。
作为奖励,我一直在使用一个基准测试工具来比较NYTProf的两次运行,我宁愿使用它,而不是通常的基准测试工具。如果我想出了一个自动化的方法,我也会分享它。
4条答案
按热度按时间txu3uszq1#
谷歌找到了这个lovely test scenario:
请注意,对于利润最高的情况(蛋白质匹配),报告的收益仅约为2%:
ecbunoof2#
我会留下笔记作为答案,稍后我会把它发展成一个实际的答案:
在 pp.c 的
PP(pp_study)
中,它有以下几行奇怪的代码(没有注解):看起来带UTF8标志的标量根本没有被研究过。
6tr1vspr3#
不完全是。如果你搜索,大多数结果是在Perl测试套件,这意味着没有人使用它。而且,由于bug,你只能notice speed benefits on global variables。它实际上带来了一些速度增强时,处理英语(有时甚至快2倍),但你必须使变量全局。
它有时也会导致infinite loops或false positives(
study
可能会给你的程序增加bug,即使它只是为了让程序更快),因此在Perl 5.16中它被删除了(或者更确切地说,使之成为空操作)--没有人想维护一个没有人关心的部分。hgqdbh6s4#
无。自2012年以来,study does nothing。
目前代码有
这意味着
study
在它以前已经做了一些事情的情况下返回true,否则返回false--但是它实际上从来没有做过任何事情。