加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby:optimize => phrase.split(delimiter).collect {| p

发布时间:2020-12-17 03:57:52 所属栏目:百科 来源:网络整理
导读:ruby:什么是最优化的表达式来评估与结果相同的结果 phrase.split(delimiter).collect {|p| p.lstrip.rstrip } 解决方法 为了清晰起见,我更喜欢以下内容: phrase.split(delimiter).collect(:strip) 但我认为你想要优化速度.我不知道为什么其他人在猜测.找出
ruby:什么是最优化的表达式来评估与结果相同的结果

phrase.split(delimiter).collect {|p| p.lstrip.rstrip }

解决方法

为了清晰起见,我更喜欢以下内容:

phrase.split(delimiter).collect(&:strip)

但我认为你想要优化速度.我不知道为什么其他人在猜测.找出更快速的方法的唯一方法是对代码进行基准测试.

确保调整基准参数 – 这只是一个例子.

require "benchmark"

# Adjust parameters below for your typical use case.
n = 10_000
input = " This is - an example. - A relatively long string " +
  "- delimited by dashes. - Adjust if necessary " * 100
delimiter = "-"

Benchmark.bmbm do |bench|
  bench.report "collect { |s| s.lstrip.rstrip }" do
    # Your example.
    n.times { input.split(delimiter).collect { |s| s.lstrip.rstrip } }
  end

  bench.report "collect { |s| s.strip }" do
    # Use .strip instead of .lstrip.rstrip.
    n.times { input.split(delimiter).collect { |s| s.strip } }
  end

  bench.report "collect { |s| s.strip! }" do
    # Use .strip! to modifiy strings in-place.
    n.times { input.split(delimiter).collect { |s| s.strip! } }
  end

  bench.report "collect(&:strip!)" do
    # Slow block creation (&:strip! syntax).
    n.times { input.split(delimiter).collect(&:strip!) }
  end

  bench.report "split(/s*#{delim}s*/) (static)" do
    # Use static regex -- only possible if delimiter doesn't change.
    re = Regexp.new("s*#{delimiter}s*")
    n.times { input.split(re) }
  end

  bench.report "split(/s*#{delim}s*/) (dynamic)" do
    # Use dynamic regex,slower to create every time?
    n.times { input.split(Regexp.new("s*#{delimiter}s*")) }
  end
end

我的笔记本电脑上的结果与上面列出的参数:

user     system      total        real
collect { |s| s.lstrip.rstrip }   7.970000   0.050000   8.020000 (  8.246598)
collect { |s| s.strip }           6.350000   0.050000   6.400000 (  6.837892)
collect { |s| s.strip! }          5.110000   0.020000   5.130000 (  5.148050)
collect(&:strip!)                 5.700000   0.030000   5.730000 (  6.010845)
split(/s*#{delim}s*/) (static)  6.890000   0.030000   6.920000 (  7.071058)
split(/s*#{delim}s*/) (dynamic) 6.900000   0.020000   6.920000 (  6.983142)

从上面我可以得出结论:

>使用strip而不是.lstrip.rstrip更快.
>首选&amp ;:剥离!超过{| s | s.strip!带来了性能成本.
>简单的正则表达式模式几乎与使用分割条带一样快.

我能想到的事情可能会影响结果:

>分隔符的长度(以及是否为空格).
>要分割的字符串的长度.
>字符串中可拆分块的长度.

但是不要相信我的话.测量它!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读