2021/07/08 今週の気になった bugs.ruby のチケット

今週は Ruby 3.1.0 で default gem から bundled gem に移動するチケットなどを載せています。

[Feature #17873] Update of default gems in Ruby 3.1

  • Ruby 3.1 からいくつかの default gem が bundled gem に変更されるチケット
  • 現時点で(あくまでも現時点で)は以下の default gem が bundled gem に変更されるので注意する必要がある
  • また以下の gem は default gem から取り除かれます
    • tracer
    • dbm
    • gdbm
  • default gem と bundled gem の違い
    • default gem
      • Ruby 本体にバンドルされている gem
      • gem 単体で更新可能
      • gem 自体を削除するのは不可能
      • bundler 環境でも使用可能
    • bundled gem
      • Ruby 本体にバンドルされている gem
        • gem 単体で更新可能
        • gem 自体を削除するのは可能
        • bundler 環境では使用不可能
          • 使用する場合は明示的に Gemfilegem "xxx" と書いておく必要がある
    • bundled gem と default gem の違いの具体例 - @znz blog
  • ちなみにこの影響で capypara などが壊れたらしい

[Bug #16243 完了] case/when is slower than if on MRI

  • Ruby 2.6.5 で if 文よりも case when 文の方が遅いというバグ報告
# frozen_string_literal: true
require "benchmark/ips"

def deep_dup_case(obj)
  case obj
  when Integer, Float, TrueClass, FalseClass, NilClass
    obj
  when String
    obj.dup
  when Array
    obj.map { |e| deep_dup_case(e) }
  when Hash
    duped = obj.dup
    duped.each_pair do |key, value|
      duped[key] = deep_dup_case(value)
    end
  else
    obj.dup
  end
end

def deep_dup_if(obj)
  if Integer === obj || Float === obj || TrueClass === obj || FalseClass === obj || NilClass === obj
    obj
  elsif String === obj
    obj.dup
  elsif Array === obj
    obj.map { |e| deep_dup_if(e) }
  elsif Hash === obj
    duped = obj.dup
    duped.each_pair do |key, value|
      duped[key] = deep_dup_if(value)
    end
    duped
  else
    obj.dup
  end
end


obj = { "class" => "FooWorker", "args" => [1, 2, 3, "foobar"], "jid" => "123987123" }

Benchmark.ips do |x|
  x.report("deep_dup_case") do
    deep_dup_case(obj)
  end

  x.report("deep_dup_if") do
    deep_dup_if(obj)
  end

  x.compare!
end
Warming up --------------------------------------
       deep_dup_case    37.767k i/100ms
         deep_dup_if    41.802k i/100ms
Calculating -------------------------------------
       deep_dup_case    408.046k (± 0.9%) i/s -      2.077M in   5.090997s
         deep_dup_if    456.657k (± 0.9%) i/s -      2.299M in   5.035040s

Comparison:
         deep_dup_if:   456657.4 i/s
       deep_dup_case:   408046.1 i/s - 1.12x  slower
  • 最新版では改善されているそうなのでシュッと閉じられている