From: sawadatsuyoshi@... Date: 2020-08-09T22:51:17+00:00 Subject: [ruby-core:99527] [Ruby master Bug#17109] Eliminate the performance impact of operands order in array's | and & Issue #17109 has been updated by sawa (Tsuyoshi Sawada). `a & b` returns different result from `b & a`. `a | b` returns different result from `b | a`. You cannot substitute one with another. ---------------------------------------- Bug #17109: Eliminate the performance impact of operands order in array's | and & https://bugs.ruby-lang.org/issues/17109#change-86987 * Author: andrey.samsonov@gmail.com (Andrey Samsonov) * Status: Open * Priority: Normal * ruby -v: 2.8 * Backport: 2.5: UNKNOWN, 2.6: UNKNOWN, 2.7: UNKNOWN ---------------------------------------- When I do intersection (`a & b`) or union (` a | b`) usually one of the arrays is more likely longer than the second one. I always try to remember in what order should I write `a` and` b` for the best performance. The right answers for current implementation are `longer & shorter` and` longer | shorter`. [Here](https://github.com/kryzhovnik/ruby/commit/3b5923746792db5a73bc80a2cb9fe982d41a9fa3) I suggest to make it simpler and eliminate the difference. Sorry I don't know C. Though I suppose my solution might be too blunt and verbose, I hope it demonstrates the idea. make benchmark ITEM=array_union COMPARE_RUBY=~/.rbenv/versions/2.8.0-dev/bin/ruby | |compare-ruby|built-ruby| |:-------------------------|-----------:|---------:| |small-& | 4.315M| 4.228M| | | 1.02x| -| |small-intersection | 4.157M| 4.106M| | | 1.01x| -| |big-& | 107.258k| 132.051k| | | -| 1.23x| |big-intersection | 103.245k| 128.052k| | | -| 1.24x| |big-reverse-intersection | 96.544k| 159.201k| | | -| 1.65x| My own [test](https://gist.github.com/kryzhovnik/288953a5c89df10e2611668703a1511c) shows 20-30% perf improvement of Array#union. -- https://bugs.ruby-lang.org/ Unsubscribe: