Skip to content

Commit 7feab7d

Browse files
byroottenderlove
andcommitted
BufferedIO#getbyte: optimistically read the next byte
This method is a big hotspot for parsing, by not pessimistically checking the size of the buffer we save a few method calls on the green path. Co-authored-by: Aaron Patterson <[email protected]>
1 parent bcb8936 commit 7feab7d

File tree

3 files changed

+28
-26
lines changed

3 files changed

+28
-26
lines changed

benchmark/drivers_ruby.md

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,53 +7,53 @@ redis-server: `Redis server v=7.0.12 sha=00000000:0 malloc=libc bits=64 build=a1
77

88
```
99
ruby 3.3.0 (2023-12-25 revision 5124f9ac75) [arm64-darwin23]
10-
hiredis: 5369.2 i/s
11-
ruby: 3095.8 i/s - 1.73x slower
10+
hiredis: 5470.4 i/s
11+
ruby: 3246.7 i/s - 1.68x slower
1212
1313
```
1414

1515
### large string x 100
1616

1717
```
1818
ruby 3.3.0 (2023-12-25 revision 5124f9ac75) [arm64-darwin23]
19-
hiredis: 303.9 i/s
20-
ruby: 217.9 i/s - 1.39x slower
19+
hiredis: 304.4 i/s
20+
ruby: 230.2 i/s - 1.32x slower
2121
2222
```
2323

2424
### small list x 100
2525

2626
```
2727
ruby 3.3.0 (2023-12-25 revision 5124f9ac75) [arm64-darwin23]
28-
hiredis: 2706.0 i/s
29-
ruby: 1325.4 i/s - 2.04x slower
28+
hiredis: 2643.4 i/s
29+
ruby: 1312.4 i/s - 2.01x slower
3030
3131
```
3232

3333
### large list
3434

3535
```
3636
ruby 3.3.0 (2023-12-25 revision 5124f9ac75) [arm64-darwin23]
37-
hiredis: 6827.5 i/s
38-
ruby: 1755.0 i/s - 3.89x slower
37+
hiredis: 6761.3 i/s
38+
ruby: 1796.0 i/s - 3.76x slower
3939
4040
```
4141

4242
### small hash x 100
4343

4444
```
4545
ruby 3.3.0 (2023-12-25 revision 5124f9ac75) [arm64-darwin23]
46-
hiredis: 3453.2 i/s
47-
ruby: 1359.5 i/s - 2.54x slower
46+
hiredis: 3293.2 i/s
47+
ruby: 1435.0 i/s - 2.29x slower
4848
4949
```
5050

5151
### large hash
5252

5353
```
5454
ruby 3.3.0 (2023-12-25 revision 5124f9ac75) [arm64-darwin23]
55-
hiredis: 1655.5 i/s
56-
ruby: 1666.5 i/s - same-ish: difference falls within error
55+
hiredis: 1765.3 i/s
56+
ruby: 1782.7 i/s - same-ish: difference falls within error
5757
5858
```
5959

benchmark/drivers_yjit.md

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,53 +7,53 @@ redis-server: `Redis server v=7.0.12 sha=00000000:0 malloc=libc bits=64 build=a1
77

88
```
99
ruby 3.3.0 (2023-12-25 revision 5124f9ac75) +YJIT [arm64-darwin23]
10-
hiredis: 6795.5 i/s
11-
ruby: 5696.7 i/s - 1.19x slower
10+
hiredis: 6810.9 i/s
11+
ruby: 5613.1 i/s - 1.21x slower
1212
1313
```
1414

1515
### large string x 100
1616

1717
```
1818
ruby 3.3.0 (2023-12-25 revision 5124f9ac75) +YJIT [arm64-darwin23]
19-
hiredis: 291.0 i/s
20-
ruby: 339.3 i/s - same-ish: difference falls within error
19+
hiredis: 312.1 i/s
20+
ruby: 316.3 i/s - same-ish: difference falls within error
2121
2222
```
2323

2424
### small list x 100
2525

2626
```
2727
ruby 3.3.0 (2023-12-25 revision 5124f9ac75) +YJIT [arm64-darwin23]
28-
hiredis: 3661.1 i/s
29-
ruby: 2351.8 i/s - 1.56x slower
28+
hiredis: 3644.1 i/s
29+
ruby: 2474.0 i/s - 1.47x slower
3030
3131
```
3232

3333
### large list
3434

3535
```
3636
ruby 3.3.0 (2023-12-25 revision 5124f9ac75) +YJIT [arm64-darwin23]
37-
hiredis: 6839.3 i/s
38-
ruby: 5330.8 i/s - 1.28x slower
37+
hiredis: 6884.4 i/s
38+
ruby: 5473.2 i/s - 1.26x slower
3939
4040
```
4141

4242
### small hash x 100
4343

4444
```
4545
ruby 3.3.0 (2023-12-25 revision 5124f9ac75) +YJIT [arm64-darwin23]
46-
hiredis: 3966.9 i/s
47-
ruby: 3243.4 i/s - 1.22x slower
46+
hiredis: 4033.9 i/s
47+
ruby: 3236.3 i/s - 1.25x slower
4848
4949
```
5050

5151
### large hash
5252

5353
```
5454
ruby 3.3.0 (2023-12-25 revision 5124f9ac75) +YJIT [arm64-darwin23]
55-
hiredis: 4609.7 i/s
56-
ruby: 4612.8 i/s - same-ish: difference falls within error
55+
hiredis: 4753.7 i/s
56+
ruby: 4637.7 i/s - same-ish: difference falls within error
5757
5858
```
5959

lib/redis_client/ruby_connection/buffered_io.rb

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,10 @@ def write(string)
8282
end
8383

8484
def getbyte
85-
ensure_remaining(1)
86-
byte = @buffer.getbyte(@offset)
85+
unless byte = @buffer.getbyte(@offset)
86+
ensure_remaining(1)
87+
byte = @buffer.getbyte(@offset)
88+
end
8789
@offset += 1
8890
byte
8991
end

0 commit comments

Comments
 (0)