diff options
| author | 2021-10-18 16:44:11 +0100 | |
|---|---|---|
| committer | 2021-10-20 11:20:50 +0000 | |
| commit | d1da3ae0aa3ddde0b129364b5e1c6073f7bdb7b7 (patch) | |
| tree | a55c36452f8f6b28c40f6c72c435dd788b29b5dc /runtime/native/java_lang_String.cc | |
| parent | 91a16c9d16178428fdbf405fb62fc953e9a28fa3 (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.cc | 9 |
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"), |