Revision: 16734
Author:   [email protected]
Date:     Mon Sep 16 13:13:42 2013 UTC
Log: 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
[email protected], [email protected]

Review URL: https://codereview.chromium.org/24174002
http://code.google.com/p/v8/source/detail?r=16734

Modified:
 /branches/bleeding_edge/src/heap-snapshot-generator.cc
 /branches/bleeding_edge/src/heap-snapshot-generator.h

=======================================
--- /branches/bleeding_edge/src/heap-snapshot-generator.cc Mon Sep 16 09:16:03 2013 UTC +++ /branches/bleeding_edge/src/heap-snapshot-generator.cc Mon Sep 16 13:13:42 2013 UTC
@@ -2693,37 +2693,21 @@


 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
=======================================
--- /branches/bleeding_edge/src/heap-snapshot-generator.h Mon Sep 16 09:16:03 2013 UTC +++ /branches/bleeding_edge/src/heap-snapshot-generator.h Mon Sep 16 13:13:42 2013 UTC
@@ -658,7 +658,6 @@
   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;

--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to