summaryrefslogtreecommitdiff
path: root/runtime/native/java_lang_String.cc
diff options
context:
space:
mode:
author Nikita Iashchenko <nikitai@google.com> 2021-10-18 16:44:11 +0100
committer Nikita Iashchenko <nikitai@google.com> 2021-10-20 11:20:50 +0000
commitd1da3ae0aa3ddde0b129364b5e1c6073f7bdb7b7 (patch)
treea55c36452f8f6b28c40f6c72c435dd788b29b5dc /runtime/native/java_lang_String.cc
parent91a16c9d16178428fdbf405fb62fc953e9a28fa3 (diff)
OpenJDK 11: Add String.repeat()
Add native implementation for java.lang.String#repeat(). This implementation is 4.7-40.9 times faster (depending on how large result string is) than naive StringBuilder implementation. | Test | Java, ns | ART, ns | Gain | |------------------+------------+------------+-------| | len:1 reps:1m | 15,553,793 | 379,730 | 40.96 | | len:13 reps:10 | 724 | 154 | 4.7 | | len:13 reps:100k | 7,099,111 | 553,559 ns | 12.82 | Bug: 202962059 Test: atest CtsLibcoreOjTestCases:test.java.lang.String.StringRepeat Test: atest LibcoreBenchmarkTests:libcore.benchmark.StringTest Change-Id: I6535bb9201c14c455f0b13988e034919049e1222
Diffstat (limited to 'runtime/native/java_lang_String.cc')
-rw-r--r--runtime/native/java_lang_String.cc9
1 files changed, 9 insertions, 0 deletions
diff --git a/runtime/native/java_lang_String.cc b/runtime/native/java_lang_String.cc
index 86f93299d9..94ca5b53d6 100644
--- a/runtime/native/java_lang_String.cc
+++ b/runtime/native/java_lang_String.cc
@@ -109,10 +109,19 @@ static jcharArray String_toCharArray(JNIEnv* env, jobject java_this) {
return soa.AddLocalReference<jcharArray>(mirror::String::ToCharArray(s, soa.Self()));
}
+static jstring String_doRepeat(JNIEnv* env, jobject java_this, jint count) {
+ ScopedFastNativeObjectAccess soa(env);
+ StackHandleScope<1> hs(soa.Self());
+ Handle<mirror::String> string = hs.NewHandle(soa.Decode<mirror::String>(java_this));
+ ObjPtr<mirror::String> result = mirror::String::DoRepeat(soa.Self(), string, count);
+ return soa.AddLocalReference<jstring>(result);
+}
+
static JNINativeMethod gMethods[] = {
FAST_NATIVE_METHOD(String, charAt, "(I)C"),
FAST_NATIVE_METHOD(String, compareTo, "(Ljava/lang/String;)I"),
FAST_NATIVE_METHOD(String, concat, "(Ljava/lang/String;)Ljava/lang/String;"),
+ FAST_NATIVE_METHOD(String, doRepeat, "(I)Ljava/lang/String;"),
FAST_NATIVE_METHOD(String, doReplace, "(CC)Ljava/lang/String;"),
FAST_NATIVE_METHOD(String, fastSubstring, "(II)Ljava/lang/String;"),
FAST_NATIVE_METHOD(String, getCharsNoCheck, "(II[CI)V"),