[前][次][番号順一覧][スレッド一覧]

ruby-changes:72440

From: Jean <ko1@a...>
Date: Thu, 7 Jul 2022 00:26:18 +0900 (JST)
Subject: [ruby-changes:72440] 906f7cb3e7 (master): vm_opt_ltlt: call rb_str_buf_append directly if RHS is a String

https://git.ruby-lang.org/ruby.git/commit/?id=906f7cb3e7

From 906f7cb3e7e6de2b75dc4a4a3c09f98d8bf28388 Mon Sep 17 00:00:00 2001
From: Jean Boussier <jean.boussier@g...>
Date: Wed, 6 Jul 2022 12:31:54 +0200
Subject: vm_opt_ltlt: call rb_str_buf_append directly if RHS is a String

`rb_str_concat` does a lot of type checking we can easily bypass.

```

|               |compare-ruby|built-ruby|
|:--------------|-----------:|---------:|
|string_concat  |    362.007k|  398.965k|
|               |           -|     1.10x|
```
---
 benchmark/string_concat.yml | 13 +++++++++++++
 vm_insnhelper.c             |  6 +++++-
 2 files changed, 18 insertions(+), 1 deletion(-)
 create mode 100644 benchmark/string_concat.yml

diff --git a/benchmark/string_concat.yml b/benchmark/string_concat.yml
new file mode 100644
index 0000000000..da403e7a53
--- /dev/null
+++ b/benchmark/string_concat.yml
@@ -0,0 +1,13 @@ https://github.com/ruby/ruby/blob/trunk/benchmark/string_concat.yml#L1
+prelude: |
+  CHUNK = "a" * 64
+benchmark:
+  string_concat: |
+    buffer = String.new(capacity: 4096)
+    buffer << CHUNK << CHUNK << CHUNK << CHUNK << CHUNK << CHUNK << CHUNK << CHUNK
+    buffer << CHUNK << CHUNK << CHUNK << CHUNK << CHUNK << CHUNK << CHUNK << CHUNK
+    buffer << CHUNK << CHUNK << CHUNK << CHUNK << CHUNK << CHUNK << CHUNK << CHUNK
+    buffer << CHUNK << CHUNK << CHUNK << CHUNK << CHUNK << CHUNK << CHUNK << CHUNK
+    buffer << CHUNK << CHUNK << CHUNK << CHUNK << CHUNK << CHUNK << CHUNK << CHUNK
+    buffer << CHUNK << CHUNK << CHUNK << CHUNK << CHUNK << CHUNK << CHUNK << CHUNK
+    buffer << CHUNK << CHUNK << CHUNK << CHUNK << CHUNK << CHUNK << CHUNK << CHUNK
+    buffer << CHUNK << CHUNK << CHUNK << CHUNK << CHUNK << CHUNK << CHUNK << CHUNK
diff --git a/vm_insnhelper.c b/vm_insnhelper.c
index abc8aef053..8db11be5e5 100644
--- a/vm_insnhelper.c
+++ b/vm_insnhelper.c
@@ -5376,7 +5376,11 @@ vm_opt_ltlt(VALUE recv, VALUE obj) https://github.com/ruby/ruby/blob/trunk/vm_insnhelper.c#L5376
     }
     else if (RBASIC_CLASS(recv) == rb_cString &&
 	     BASIC_OP_UNREDEFINED_P(BOP_LTLT, STRING_REDEFINED_OP_FLAG)) {
-	return rb_str_concat(recv, obj);
+	if (LIKELY(RB_TYPE_P(obj, T_STRING))) {
+	    return rb_str_buf_append(recv, obj);
+	} else {
+	    return rb_str_concat(recv, obj);
+	}
     }
     else if (RBASIC_CLASS(recv) == rb_cArray &&
 	     BASIC_OP_UNREDEFINED_P(BOP_LTLT, ARRAY_REDEFINED_OP_FLAG)) {
-- 
cgit v1.2.1


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]