tl;dr:delete_if
少し速いようです。ただし、メソッドを選択する際の主な考慮事項は、他の回答で指摘されているように、戻り値の違いです。
あなたの質問が効率に関するものであることを明確にしたので、いくつかのテストを行いました。
> time { (1..100000).to_a.reject!{ |n| n % 5 == 0 } }
0.390000 0.000000 0.390000 ( 0.394596)
> time { (1..100000).to_a.delete_if{ |n| n % 5 == 0 } }
0.400000 0.000000 0.400000 ( 0.399122)
> time { (1..200000).to_a.reject!{ |n| n % 5 == 0 } }
1.650000 0.000000 1.650000 ( 1.657927)
> time { (1..200000).to_a.delete_if{ |n| n % 5 == 0 } }
1.630000 0.010000 1.640000 ( 1.637719)
> time { (1..300000).to_a.reject!{ |n| n % 5 == 0 } }
3.700000 0.000000 3.700000 ( 3.717206)
> time { (1..300000).to_a.delete_if{ |n| n % 5 == 0 } }
3.660000 0.000000 3.660000 ( 3.686213)
> time { (1..400000).to_a.reject!{ |n| n % 5 == 0 } }
7.320000 0.020000 7.340000 ( 7.361767)
> time { (1..400000).to_a.delete_if{ |n| n % 5 == 0 } }
7.190000 0.020000 7.210000 ( 7.239549)
ということで、ある程度以上のサイズのdelete_if
方が若干速いようです。
time
と定義されている:
def time(&block)
puts Benchmark.measure(&block)
end
数値は、それぞれユーザー CPU 時間、システム CPU 時間、ユーザー CPU 時間とシステム CPU 時間の合計、および経過した実時間を表します。ここで、それらの意味の説明を見つけることができます。すべてのベンチマーク、YMMV と同様に、5 の倍数である数値を削除するという私の不自然な例ではなく、特定のワークフローでテストする必要があることに注意してください。