Optimization: Return only arrays from getCaptureTree

Creating objects and setting key-value pairs is more expensive than creating arrays with numeric indices. So this squeezes a bit more performance.
This commit is contained in:
Nathan Sobo
2012-08-08 09:41:08 -06:00
parent c6c4d6413e
commit f1438f2806
2 changed files with 22 additions and 39 deletions

View File

@@ -52,31 +52,29 @@ public:
int currentIndex = index++;
int startPosition = [result locationAt:currentIndex];
int endPosition = startPosition + [result lengthAt:currentIndex];
CefRefPtr<CefV8Value> childCaptures;
CefRefPtr<CefV8Value> tree = CefV8Value::CreateArray();
int i = 0;
tree->SetValue(i++, CefV8Value::CreateInt(currentIndex));
tree->SetValue(i++, CefV8Value::CreateInt(startPosition));
tree->SetValue(i++, CefV8Value::CreateInt(endPosition));
while (index < [result count] && [result locationAt:index] < endPosition) {
if ([result lengthAt:index] == 0) {
index++;
}
else {
if (!childCaptures.get()) childCaptures = CefV8Value::CreateArray();
childCaptures->SetValue(childCaptures->GetArrayLength(), BuildCaptureTree(result, index));
} else {
tree->SetValue(i++, BuildCaptureTree(result, index));
}
}
CefRefPtr<CefV8Value> tree = CefV8Value::CreateObject(NULL, NULL);
tree->SetValue("index", CefV8Value::CreateInt(currentIndex), V8_PROPERTY_ATTRIBUTE_NONE);
tree->SetValue("start", CefV8Value::CreateInt(startPosition), V8_PROPERTY_ATTRIBUTE_NONE);
tree->SetValue("end", CefV8Value::CreateInt(endPosition), V8_PROPERTY_ATTRIBUTE_NONE);
if (currentIndex == 0) {
tree->SetValue("text", CefV8Value::CreateString([[result stringAt:currentIndex] UTF8String]), V8_PROPERTY_ATTRIBUTE_NONE);
CefRefPtr<CefV8Value> tuple = CefV8Value::CreateArray();
tuple->SetValue(0, CefV8Value::CreateString([[result stringAt:0] UTF8String]));
tuple->SetValue(1, tree);
return tuple;
} else {
return tree;
}
if (childCaptures.get()) tree->SetValue("captures", childCaptures, V8_PROPERTY_ATTRIBUTE_NONE);
return tree;
}
CefRefPtr<CefV8Value> CaptureCount() {