【问题标题】:Performance about replace() or substr() in JavascriptJavascript 中关于 replace() 或 substr() 的性能
【发布时间】:2012-03-06 15:31:08
【问题描述】:

我想知道关于使用 string.replace() 或 string.substr() 的 Javascript 性能。让我解释一下我在做什么。

我有一个类似的字符串

str = "a.aa.a.aa."

我只需要“弹出” str 中的最后一个元素,我总是知道它是什么类型的字符(例如,这里是一个点)。

很简单,我可以按照很多方法,比如

str = str.substr(0, str.length-1) // same as using slice()

str = str.replace(/\.$/, '')

您会使用哪些方法?为什么?使用这种或那种方法是否有一些性能不足?字符串的长度可以忽略不计。

(这是我的第一篇文章,所以如果我做错了什么,请通知我!)

【问题讨论】:

    标签: javascript regex replace slice substr


    【解决方案1】:

    对于 JavaScript 中的性能测试,请使用 jsPerf.com

    我为您的问题here 创建了一个测试用例,它表明substr 的速度要快得多(至少在 Firefox 中是这样)。

    【讨论】:

    • 只是插话,我did the same,除了我添加了slice(0, -1)(速度较慢)。从逻辑上讲,值得补充的是,我们应该期望正则表达式会更慢,因为至少它是在测试字符串部分是否匹配的步骤中添加的。
    • 太酷了!我忘了[jsperf.com](jsPerf.com),我前段时间用过。无论如何,谢谢你的回复!
    • 但是如何使用substr 替换字符串的特定部分?即`“我的名字是Hello World”.replace('Hello', 'Hi'); ` ,如果您需要首先获取开始和结束位置的索引,那么该开销是否会影响substr 的性能提升?
    • @benjaminz 您可以轻松地在 jsperf 上进行我的测试并根据您的目的进行调整。然后重新运行它,自己看看,-)
    【解决方案2】:

    如果你只想要字符串中的最后一个字符,那么使用下标,而不是一些替换:

    str[str.length-1]
    

    【讨论】:

    • 是的,我知道,但我必须修改字符串,而不仅仅是读取最后一个元素。
    【解决方案3】:

    您是否必须循环执行数千次?如果不是(并且“字符串的长度可以忽略不计”),任何方式都可以。

    也就是说,我更喜欢第一个选项,因为它使修剪最后一个字符的意图比第二个更清晰(哦,它更快,以防您确实需要运行这个无数次。因为在正则表达式的情况下,您不仅需要构建一个新字符串,还需要编译一个正则表达式并针对输入运行它。)

    【讨论】:

    • @FlorianMargaine:太棒了。对于正则表达式解决方案,JS VM 必须编译正则表达式,针对输入字符串运行它并构建一个新字符串。对于 substr() 解决方案,只需要构建一个新字符串。请参阅 Sirko 的回答。
    • 我的错,我实际上错了(感谢上帝!正则表达式仍然很慢。)。不过,您需要编辑答案,以便我可以取消投票。
    • 真诚地,我必须连续做一次。无论如何,也更喜欢使用第一个选项 :) 感谢您的回复。
    【解决方案4】:

    当你有这种疑问时,要么选择你最喜欢的(从风格上讲,因为只运行一次并不重要),或者使用http://jsperf.com。 p>

    对于这个例子,请看这里why substr is better :-)。

    【讨论】:

      【解决方案5】:

      substr 方式应该总是比任何类型的 RegExp 都快。但是性能差异应该很小。

      【讨论】:

      • 好吧,看看 Sirko 的 jsPerf.com 链接,它清楚地表明 substr 更快......
      • 好吧,这很奇怪。您发布的 jsPerf 链接显然支持正则表达式,但 Sirko 支持 substr。
      • @xato 仔细看:名字在 Florian 的测试用例中切换
      • 我的错。我觉得很愚蠢,那里。编辑您的问题,以便我可以取消投票:-)
      • 我已经为这个案例添加了一个 jsperf jsperf.com/replacing-the-last-character-of-a-string/1
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-30
      • 2013-03-30
      • 1970-01-01
      • 2012-04-02
      • 1970-01-01
      相关资源
      最近更新 更多