【发布时间】:2013-03-06 02:56:10
【问题描述】:
一个问题:
我想处理一个字符串 (str),以便将任何带括号的数字(与 rgx 匹配)替换为从数组中适当位置获取的值 (sub):
var rgx = /\((\d+)\)/,
str = "this (0) a (1) sentence",
sub = [
"is",
"test"
],
result;
鉴于上面声明的变量,result 应该是“这是一个测试语句”。
两种解决方案:
var mch,
parsed = '',
remainder = str;
while (mch = rgx.exec(remainder)) { // Not JSLint approved.
parsed += remainder.substring(0, mch.index) + sub[mch[1]];
remainder = remainder.substring(mch.index + mch[0].length);
}
result = (parsed) ? parsed + remainder : str;
但我认为下面的代码会更快。它的变量更少,更简洁,并使用匿名函数表达式(或 lambda):
result = str.replace(rgx, function() {
return sub[arguments[1]];
});
This works too,但是速度我错了; in Chrome it's surprisingly (~50%, last time I checked) slower!
...
三个问题:
- 为什么这个过程在 Chrome 中看起来更慢,而在 Firefox 中(例如)更快?
- 在给定更大的字符串或数组的情况下,
replace()方法是否有可能比while()循环更快?如果不是,它在Code Golf之外有什么好处? - 有没有办法优化这个过程,让它像第二种功能方法一样更高效、更轻松?
我欢迎任何关于这些过程背后发生了什么的见解。
...
[Fo(u)r 记录:我很高兴有人指出我对“lambda”和/或“功能性”这两个词的使用。我还在学习这些概念,所以不要以为我完全知道我在说什么,如果我在这里误用了这些术语,请随时纠正我。]
【问题讨论】:
-
在 JS 中不叫“lamba”,而是“(匿名)函数表达式”,虽然是同一个概念。 “功能性”是正确的术语。
-
JSYK,在 IE10 中匿名函数方法的 ops/s 大约是两倍
-
@Bergi 感谢您的澄清和保证。我知道术语“匿名函数表达式”(以及 JavaScript 用户更常见的用法)。但我认为“lambda”是足够的同义词 [?],可能会吸引那些对函数式编程有更一般知识的人,因此会吸引那些可能能够更多地谈论 w/r 优化的人的答案/t 不同的编程范式。我现在更新了问题以包含术语“匿名函数表达式”。希望这更有意义。
-
@Kolink 感谢您指出这一点。同样有趣的是,IE 10.0 的整体性能优于 Firefox 19.0...
-
@guypursey:是的,“lambda”也很好,也很明确,它只是针对更多了解函数式编程的人:-)
标签: javascript regex performance optimization lambda