結晶は、.detect
ではなく、.find
の方法である。 (Whyを参照)
Hash
はヒープメモリを割り当てるので、case
ステートメントよりも遅いです。また
あなたは
hash 46.48M (21.51ns) (±14.08%) 3.90× slower
nametuple 173.82M ( 5.75ns) (±15.75%) 1.04× slower
case 181.28M ( 5.52ns) (±13.24%) fastest
、450バイトの少量のために
require "benchmark"
input = %w(a b c x y z)
valid1 = {"a" => true, "z" => true}
valid2 = {"a": true, "z": true}
Benchmark.ips do |x|
x.report("hash") do
input.find do |x|
!valid1.has_key?(x)
end
end
x.report("nametuple") do
input.find do |x|
!valid2.has_key?(x)
end
end
x.report("case") do
input.find do |x|
case x
when "a", "z"
false
else
true
end
end
end
end
Try it online!
これは非常に良い答えです。ちょっとしたニックピット:NamedTupleをさらに値で埋めると、CASE式(https:// play)と比較して、パフォーマンスが大幅に低下する(45倍速い、--release --no-debug)ようです。 crystal-lang.org/#/r/3196(tio.runを使用しようとしましたが、URLが長すぎるためURL短縮者が許可されません) –
ええ、そうです、 'case'はこれまでのところ最速ですhttps://carc.in/#/r/31y6(tio.runのURLをコピーしてください) –