fastruby / fastruby/fast-ruby

`str.count("\n")` is 1.3-170 times faster than `str.lines.count` or `str.each_line.count` depending on the string size

Open
#220 6 comments 0 reactions 0 assignees View on GitHub
Dominant language
Ruby
Stars
5.7k
Forks
371
PR merge metrics
No merged PRs in 30d

Description

`str.count("\n")` is 1.3-170 times faster than `str.lines.count` or `str.each_line.count` (ref: https://serpapi.com/blog/lines-count-failed-deployments/). The speed difference grows with the lines count.

```bash
$ ruby tmp/string_count_benchmark.rb
Warming up --------------------------------------
String#count('\n') 86.000 i/100ms
String#lines.size 1.000 i/100ms
String#lines.count 1.000 i/100ms
String#each_line.count
1.000 i/100ms
Calculating -------------------------------------
String#count('\n') 771.031 (± 6.6%) i/s - 3.870k in 5.041849s
String#lines.size 4.785 (± 0.0%) i/s - 24.000 in 5.037242s
String#lines.count 4.513 (± 0.0%) i/s - 23.000 in 5.112095s
String#each_line.count
4.763 (± 0.0%) i/s - 24.000 in 5.075882s

Comparison:
String#count('\n'): 771.0 i/s
String#lines.size: 4.8 i/s - 161.12x (± 0.00) slower
String#each_line.count: 4.8 i/s - 161.87x (± 0.00) slower
String#lines.count: 4.5 i/s - 170.86x (± 0.00) slower
```

Benchmark code:

```ruby
require "benchmark/ips"

HTML = "\nruby\n" * 1024 * 1024

def fastest
HTML.count("\n")
end

def faster
HTML.each_line.count
end

def fast
HTML.lines.length
end

def slow
HTML.lines.size
end

Benchmark.ips do |x|
x.report("String#count('\\n')") { fastest }
x.report("String#lines.size") { faster }
x.report("String#lines.count") { fast }
x.report("String#each_line.count") { slow }
x.compare!
end
```

I'd like to add this benchmark to `fast-ruby`. Wdyt?

---

Based on our updates to the @guilhermesimoes' very helpful gist: https://gist.github.com/guilhermesimoes/d69e547884e556c3dc95?permalink_comment_id=4687645#gistcomment-4687645

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.