【发布时间】:2015-10-21 20:29:33
【问题描述】:
给定perl 中的两个字符串变量$string 和$needle,检查$string 是否以$needle 开头的最有效方法是什么。
-
$string =~ /^\Q$needle\E/是我能想到的最接近的匹配项,但它是我尝试过的解决方案中效率最低的(到目前为止)。 -
index($string, $needle) == 0工作并且对于$string和$needle的某些值相对有效,但在其他位置不必要地搜索针(如果在开始时没有找到)。 -
substr($string, 0, length($needle)) eq $needle应该是相当简单和高效的,但在我的少数测试中,大部分都没有比上一个更高效。
在perl 中是否有一种我不知道的规范方法或任何优化上述解决方案的方法?
(在我的特定用例中,$string 和 $needle 在每次运行中都会有所不同,因此预编译正则表达式不是一种选择)。
如何衡量给定解决方案性能的示例(此处来自 POSIX sh):
string='somewhat not so longish string' needle='somew'
time perl -e '
($n,$string,$needle) = @ARGV;
for ($i=0;$i<$n;$i++) {
index($string, $needle) == 0
}' 10000000 "$string" "$needle"
有了这些值,index() 在这个带有 perl 5.14.2 的系统中的性能优于 substr()+eq,但是:
string="aaaaabaaaaabaaaaabaaaaabaaaaabaaaaab" needle="aaaaaa"
反过来了。
【问题讨论】:
-
不同版本的 Perl 会在这里产生影响,我建议添加您用于反馈或重用的基准代码。
-
@Ashley,好点,更新了。
-
也许你会写
String::MoreUtils::XS? -
您是否对脚本进行了分析以确认确实需要这种微优化?
-
仅供参考,您应该在任何时候使用 Benchmark module 在 Perl 中进行基准测试。
/usr/bin/time不一定会给你一个公平的比较。
标签: performance perl string-matching