diff options
| author | ksss <[email protected]> | 2015-12-31 17:52:22 +0900 |
|---|---|---|
| committer | ksss <[email protected]> | 2015-12-31 17:52:22 +0900 |
| commit | 6c1b6ef7a5d849ccfcb8cbd163443f983f264857 (patch) | |
| tree | 6145a01bbf3fbd70dd0e8618235f04eb567e499a /src | |
| parent | d3c6fafaf3fe61961a46338f4ced4d99918a8f35 (diff) | |
| download | mruby-6c1b6ef7a5d849ccfcb8cbd163443f983f264857.tar.gz mruby-6c1b6ef7a5d849ccfcb8cbd163443f983f264857.zip | |
Use memchr for performance
```ruby
s = "b"
str = ("a" * 100 + s)
t = Time.now
str.index(s)
puts Time.now - t
```
before => 0.000788
after => 0.000508
---
```ruby
s = "b"
str = ("a" * 100 * 1024 * 1024 + s)
t = Time.now
str.index(s)
puts Time.now - t
```
before => 0.225474
after => 0.008658
Diffstat (limited to 'src')
| -rw-r--r-- | src/string.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/src/string.c b/src/string.c index 6664eabd6..0d31a304f 100644 --- a/src/string.c +++ b/src/string.c @@ -352,12 +352,12 @@ mrb_memsearch(const void *x0, mrb_int m, const void *y0, mrb_int n) return 0; } else if (m == 1) { - const unsigned char *ys = y, *ye = ys + n; - for (; y < ye; ++y) { - if (*x == *y) - return y - ys; - } - return -1; + const unsigned char *ys = memchr(y, *x, n); + + if (ys) + return ys - y; + else + return -1; } return mrb_memsearch_qs((const unsigned char *)x0, m, (const unsigned char *)y0, n); } |
