From: eregontp@gmail.com
To: ruby-core@ruby-lang.org
Subject: [ruby-core:99751] [Ruby master Bug#17030] Enumerable#grep{_v} should be optimized for Regexp
Date: Fri, 28 Aug 2020 15:01:05 +0000 (UTC) [thread overview]
Message-ID: <redmine.journal-87251.20200828150104.182@ruby-lang.org> (raw)
In-Reply-To: redmine.issue-17030.20200713202650.182@ruby-lang.org
Issue #17030 has been updated by Eregon (Benoit Daloze).
This is something that a JIT with inlining and escape analysis can optimize and always be correct.
Static analysis doesn't cut it for Ruby.
On TruffleRuby (master + a fix I'll merge soon) for the benchmark above:
```
Calculating -------------------------------------
select.match? 2.503M (± 2.9%) i/s - 12.677M in 5.068796s
grep 2.502M (± 2.8%) i/s - 12.558M in 5.022837s
select.match? 2.519M (± 2.6%) i/s - 12.677M in 5.036105s
grep 2.498M (± 2.2%) i/s - 12.558M in 5.030485s
Comparison:
select.match?: 2518943.6 i/s
grep: 2497618.0 i/s - same-ish: difference falls within error
```
MRI 2.6 for comparison:
```
Calculating -------------------------------------
select.match? 943.017k (± 0.6%) i/s - 4.770M in 5.058962s
grep 470.844k (± 0.8%) i/s - 2.389M in 5.074917s
select.match? 944.326k (± 0.7%) i/s - 4.770M in 5.052020s
grep 471.122k (± 2.5%) i/s - 2.389M in 5.074969s
Comparison:
select.match?: 944325.5 i/s
grep: 471122.3 i/s - 2.00x (± 0.00) slower
```
----------------------------------------
Bug #17030: Enumerable#grep{_v} should be optimized for Regexp
https://bugs.ruby-lang.org/issues/17030#change-87251
* Author: marcandre (Marc-Andre Lafortune)
* Status: Open
* Priority: Normal
* Backport: 2.5: UNKNOWN, 2.6: UNKNOWN, 2.7: UNKNOWN
----------------------------------------
Currently,
```ruby
array.select { |e| e.match?(REGEXP) }
```
is about three times faster and six times more memory efficient than
```ruby
array.grep(REGEXP)
```
This is because `grep` calls `Regexp#===`, which creates useless `MatchData`.
--
https://bugs.ruby-lang.org/
Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>
next prev parent reply other threads:[~2020-08-28 15:01 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-07-13 20:26 [ruby-core:99156] [Ruby master Bug#17030] Enumerable#grep{_v} should be optimized for Regexp marcandre-ruby-core
2020-07-13 20:27 ` [ruby-core:99157] " marcandre-ruby-core
2020-07-14 1:24 ` [ruby-core:99161] " shyouhei
2020-07-14 3:37 ` [ruby-core:99163] " marcandre-ruby-core
2020-07-14 10:25 ` [ruby-core:99164] " nobu
2020-07-14 13:28 ` [ruby-core:99165] " eregontp
2020-07-14 13:46 ` [ruby-core:99166] " marcandre-ruby-core
2020-07-21 11:27 ` [ruby-core:99248] " scivola20
2020-08-25 17:23 ` [ruby-core:99687] " fatkodima123
2020-08-25 22:09 ` [ruby-core:99690] " fatkodima123
2020-08-25 23:37 ` [ruby-core:99692] " sawadatsuyoshi
2020-08-26 8:31 ` [ruby-core:99702] " fatkodima123
2020-08-26 15:01 ` [ruby-core:99705] " marcandre-ruby-core
2020-08-26 17:01 ` [ruby-core:99706] " fatkodima123
2020-08-26 17:30 ` [ruby-core:99708] " marcandre-ruby-core
2020-08-26 19:17 ` [ruby-core:99713] " daniel
2020-08-26 19:31 ` [ruby-core:99714] " marcandre-ruby-core
2020-08-26 20:43 ` [ruby-core:99716] " daniel
2020-08-27 2:10 ` [ruby-core:99722] " marcandre-ruby-core
2020-08-27 8:03 ` [ruby-core:99729] " fatkodima123
2020-08-27 16:58 ` [ruby-core:99737] " daniel
2020-08-27 17:16 ` [ruby-core:99738] " merch-redmine
2020-08-28 15:01 ` eregontp [this message]
2020-08-28 15:30 ` [ruby-core:99752] " eregontp
2020-09-25 6:53 ` [ruby-core:100127] " matz
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.ruby-lang.org/en/community/mailing-lists/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=redmine.journal-87251.20200828150104.182@ruby-lang.org \
--to=ruby-core@ruby-lang.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).