diff options
| author | KOBAYASHI Shuji <[email protected]> | 2019-10-23 19:03:39 +0900 |
|---|---|---|
| committer | KOBAYASHI Shuji <[email protected]> | 2019-10-23 19:03:39 +0900 |
| commit | 06bd4ffdafdaf7b18abeec22fa962d77673a72f3 (patch) | |
| tree | 96ad0b592ec116f91fb3906df46f71e2d6b272d3 /src/string.c | |
| parent | fa85f91e0e3ebff7b2626bfcf550821445c064d7 (diff) | |
| download | mruby-06bd4ffdafdaf7b18abeec22fa962d77673a72f3.tar.gz mruby-06bd4ffdafdaf7b18abeec22fa962d77673a72f3.zip | |
Optimize `str_subseq` with `MRB_UTF8_STRING` to ASCII only string
### Benchmark (with `MRB_UTF8_STRING`)
```ruby
# benchmark.rb
COUNT = 300000
SIZE = 10000
s = "a" * SIZE
s.size # set `MRB_STR_ASCII` flag
i = 0
while i < COUNT
s[-1]
i += 1
end
```
#### Before this patch:
```
$ time mruby benchmark.rb
2.06 real 2.05 user 0.00 sys
```
#### After this patch:
```
$ time mruby benchmark.rb
0.05 real 0.04 user 0.00 sys
```
Diffstat (limited to 'src/string.c')
| -rw-r--r-- | src/string.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/src/string.c b/src/string.c index 6ab9a1ff7..518b62ea3 100644 --- a/src/string.c +++ b/src/string.c @@ -603,7 +603,7 @@ str_range_to_bytes(mrb_value str, mrb_int *pos, mrb_int *len) static inline mrb_value str_subseq(mrb_state *mrb, mrb_value str, mrb_int beg, mrb_int len) { - str_range_to_bytes(str, &beg, &len); + if (!RSTR_ASCII_P(mrb_str_ptr(str))) str_range_to_bytes(str, &beg, &len); return mrb_str_byte_subseq(mrb, str, beg, len); } #else |
