【问题标题】:Performance implications of string#gsub chains?string#gsub 链的性能影响?
【发布时间】:2013-02-07 21:38:19
【问题描述】:

.gsub 和/或 .sub 方法链对 Ruby 中的字符串有任何性能影响吗?

例如,下面是一个来自 Rails 源代码的方法示例,该方法为图像创建 alt 标记。它会删除文件扩展名和摘要(如果有)。

def image_alt(src)
  File.basename(src, '.*').sub(/-[[:xdigit:]]{32}\z/, '').capitalize
end

在我的应用中,我希望它把下划线或连字符改为空格,所以我想在最后添加一个gsub 方法:

def image_alt(src)
  File.basename(src, '.*').sub(/-[[:xdigit:]]{32}\z/, '').gsub(/(_|-)/, ' ').capitalize
end

这是否会在性能或风格方面引发危险信号?

【问题讨论】:

  • 从维护的角度来看,我认为更多的正则表达式更小,比单个庞大的正则表达式要好。至于速度,我不确定。
  • 尝试两种方式并衡量性能。或者编写一个小测试程序并比较实现。现实世界的性能问题通常不是您所期望的,因此不要过早优化。
  • Ruby 包含 Benchmark 类,可以轻松找到此类问题的答案。通读示例,编写一些测试并在此处发布您的结果,以便其他人学习。

标签: ruby regex coding-style


【解决方案1】:
str.tr('-_', ' ') 

值得考虑 (doc)

【讨论】:

  • 作为参考,请参阅下面的评论:string#trstring#gsub 的基准性能与正则表达式。
  • 关于 string#tr 要了解的一点是它不能向字符串添加字符,只能替换。因此,如果您需要增加字符串的大小,则必须使用 .sub 或 .gsub。
【解决方案2】:

如果链中正则表达式的匹配项不应该重叠,则在单个 StringScanner 迭代下的条件内运行它们,同时将结果输出到 StringIO 可能会提高性能。

【讨论】:

    【解决方案3】:

    我没有遇到任何问题。我在我的几个程序中使用了一个号码gsub 呼叫,并且我没有遇到性能问题。从性能的角度来看,我不会担心它。至于风格,我想这是个人喜好。就我个人而言,我会不惜一切代价避免使用正则表达式。但这只是我。

    【讨论】:

    • 那你会说.gsub('_', ' ').gsub('-', ' ')吗?
    • @nickvoxdotme .tr('-_',' ') 值得考虑。 (doc)
    • 是的。使用 Benchmark,tr 的速度大约是使用正则表达式的gsub 的两倍,几乎是两个链接的 gsub 方法的 3 倍。 @steenslag,是否愿意将其添加为答案?
    • 使用tr 是替换此类字符的好方法。
    猜你喜欢
    • 2010-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-17
    • 2015-04-08
    相关资源
    最近更新 更多