Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(711)

Unified Diff: runtime/vm/object.cc

Issue 25087006: Improve performance of string buffer by modifying concatAll native to allow growable array and an i… (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/vm/object.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/object.cc
===================================================================
--- runtime/vm/object.cc (revision 28096)
+++ runtime/vm/object.cc (working copy)
@@ -13297,14 +13297,24 @@
RawString* String::ConcatAll(const Array& strings,
Heap::Space space) {
+ return ConcatAllRange(strings, 0, strings.Length(), space);
+}
+
+
+RawString* String::ConcatAllRange(const Array& strings,
+ intptr_t start,
+ intptr_t end,
+ Heap::Space space) {
ASSERT(!strings.IsNull());
+ ASSERT(start >= 0);
+ ASSERT(end <= strings.Length());
intptr_t result_len = 0;
- intptr_t strings_len = strings.Length();
String& str = String::Handle();
intptr_t char_size = kOneByteChar;
- for (intptr_t i = 0; i < strings_len; i++) {
+ // Compute 'char_size' and 'result_len'.
+ for (intptr_t i = start; i < end; i++) {
str ^= strings.At(i);
- intptr_t str_len = str.Length();
+ const intptr_t str_len = str.Length();
if ((kMaxElements - result_len) < str_len) {
Isolate* isolate = Isolate::Current();
const Instance& exception =
@@ -13316,10 +13326,10 @@
char_size = Utils::Maximum(char_size, str.CharSize());
}
if (char_size == kOneByteChar) {
- return OneByteString::ConcatAll(strings, result_len, space);
+ return OneByteString::ConcatAll(strings, start, end, result_len, space);
}
ASSERT(char_size == kTwoByteChar);
- return TwoByteString::ConcatAll(strings, result_len, space);
+ return TwoByteString::ConcatAll(strings, start, end, result_len, space);
}
@@ -13810,15 +13820,19 @@
RawOneByteString* OneByteString::ConcatAll(const Array& strings,
+ intptr_t start,
+ intptr_t end,
intptr_t len,
Heap::Space space) {
+ ASSERT(!strings.IsNull());
+ ASSERT(start >= 0);
+ ASSERT(end <= strings.Length());
const String& result = String::Handle(OneByteString::New(len, space));
String& str = String::Handle();
- intptr_t strings_len = strings.Length();
intptr_t pos = 0;
- for (intptr_t i = 0; i < strings_len; i++) {
+ for (intptr_t i = start; i < end; i++) {
str ^= strings.At(i);
- intptr_t str_len = str.Length();
+ const intptr_t str_len = str.Length();
String::Copy(result, pos, str, 0, str_len);
ASSERT((kMaxElements - pos) >= str_len);
pos += str_len;
@@ -13992,15 +14006,19 @@
RawTwoByteString* TwoByteString::ConcatAll(const Array& strings,
+ intptr_t start,
+ intptr_t end,
intptr_t len,
Heap::Space space) {
+ ASSERT(!strings.IsNull());
+ ASSERT(start >= 0);
+ ASSERT(end <= strings.Length());
const String& result = String::Handle(TwoByteString::New(len, space));
String& str = String::Handle();
- intptr_t strings_len = strings.Length();
intptr_t pos = 0;
- for (intptr_t i = 0; i < strings_len; i++) {
+ for (intptr_t i = start; i < end; i++) {
str ^= strings.At(i);
- intptr_t str_len = str.Length();
+ const intptr_t str_len = str.Length();
String::Copy(result, pos, str, 0, str_len);
ASSERT((kMaxElements - pos) >= str_len);
pos += str_len;
« no previous file with comments | « runtime/vm/object.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698