Commit 0daf224c authored by loislo@chromium.org's avatar loislo@chromium.org

HeapSnapshot: replace O(N*ln(N)) algorithm of sorting with O(N) one.

We have HashMap for the strings. They got id sequentially. So we could use index sort.

BUG=none
R=alph@chromium.org, yangguo@chromium.org

Review URL: https://codereview.chromium.org/24174002

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@16734 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent f30a7343
......@@ -2693,37 +2693,21 @@ void HeapSnapshotJSONSerializer::SerializeString(const unsigned char* s) {
void HeapSnapshotJSONSerializer::SerializeStrings() {
List<HashMap::Entry*> sorted_strings;
SortHashMap(&strings_, &sorted_strings);
ScopedVector<const unsigned char*> sorted_strings(
strings_.occupancy() + 1);
for (HashMap::Entry* entry = strings_.Start();
entry != NULL;
entry = strings_.Next(entry)) {
sorted_strings[reinterpret_cast<uintptr_t>(entry->value)] =
reinterpret_cast<const unsigned char*>(entry->key);
}
writer_->AddString("\"<dummy>\"");
for (int i = 0; i < sorted_strings.length(); ++i) {
for (int i = 1; i < sorted_strings.length(); ++i) {
writer_->AddCharacter(',');
SerializeString(
reinterpret_cast<const unsigned char*>(sorted_strings[i]->key));
SerializeString(sorted_strings[i]);
if (writer_->aborted()) return;
}
}
template<typename T>
inline static int SortUsingEntryValue(const T* x, const T* y) {
uintptr_t x_uint = reinterpret_cast<uintptr_t>((*x)->value);
uintptr_t y_uint = reinterpret_cast<uintptr_t>((*y)->value);
if (x_uint > y_uint) {
return 1;
} else if (x_uint == y_uint) {
return 0;
} else {
return -1;
}
}
void HeapSnapshotJSONSerializer::SortHashMap(
HashMap* map, List<HashMap::Entry*>* sorted_entries) {
for (HashMap::Entry* p = map->Start(); p != NULL; p = map->Next(p))
sorted_entries->Add(p);
sorted_entries->Sort(SortUsingEntryValue);
}
} } // namespace v8::internal
......@@ -658,7 +658,6 @@ class HeapSnapshotJSONSerializer {
void SerializeSnapshot();
void SerializeString(const unsigned char* s);
void SerializeStrings();
void SortHashMap(HashMap* map, List<HashMap::Entry*>* sorted_entries);
static const int kEdgeFieldsCount;
static const int kNodeFieldsCount;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment