summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorksss <[email protected]>2015-12-31 17:52:22 +0900
committerksss <[email protected]>2015-12-31 17:52:22 +0900
commit6c1b6ef7a5d849ccfcb8cbd163443f983f264857 (patch)
tree6145a01bbf3fbd70dd0e8618235f04eb567e499a /src
parentd3c6fafaf3fe61961a46338f4ced4d99918a8f35 (diff)
downloadmruby-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.c12
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);
}