Browse Source

Better Object metrics

Josh Engebretson 10 years ago
parent
commit
a195ec1283
2 changed files with 36 additions and 13 deletions
  1. 29 10
      Source/AtomicJS/Javascript/JSMetrics.cpp
  2. 7 3
      Source/AtomicJS/Javascript/JSMetrics.h

+ 29 - 10
Source/AtomicJS/Javascript/JSMetrics.cpp

@@ -1,4 +1,6 @@
 
 
+#include <Atomic/Container/Sort.h>
+
 #include "JSVM.h"
 #include "JSVM.h"
 #include "JSMetrics.h"
 #include "JSMetrics.h"
 
 
@@ -16,22 +18,36 @@ JSMetrics::~JSMetrics()
 
 
 }
 }
 
 
+static bool CompareObjectMetrics(const JSMetrics::ObjectMetric& lhs, const JSMetrics::ObjectMetric& rhs)
+{
+    return lhs.count > rhs.count;
+}
+
 void JSMetrics::Dump()
 void JSMetrics::Dump()
 {
 {
-    List<String>::ConstIterator itr = classNames_.Begin();
-    while (itr != classNames_.End())
+    Vector<ObjectMetric> sorted;
+
+    HashMap<StringHash, ObjectMetric>::ConstIterator itr = objectMetrics_.Begin();
+    while (itr != objectMetrics_.End())
     {
     {
-        const String& classname = *itr;
-        LOGINFOF("%s %i", classname.CString(), classInstances_[classname] );
+        sorted.Push(itr->second_);
         itr++;
         itr++;
     }
     }
 
 
+    Sort(sorted.Begin(), sorted.End(), CompareObjectMetrics);
+
+    Vector<ObjectMetric>::ConstIterator vitr = sorted.Begin();
+    while (vitr != sorted.End())
+    {
+        const String& classname = (*vitr).classname;
+        LOGINFOF("%s %i", classname.CString(), objectMetrics_[classname].count);
+        vitr++;
+    }
 }
 }
 
 
 void JSMetrics::Capture()
 void JSMetrics::Capture()
 {
 {
-    classNames_.Clear();
-    classInstances_.Clear();
+    objectMetrics_.Clear();
 
 
     HashMap<void*, RefCounted*>::ConstIterator itr = vm_->heapToObject_.Begin();
     HashMap<void*, RefCounted*>::ConstIterator itr = vm_->heapToObject_.Begin();
     while (itr != vm_->heapToObject_.End())
     while (itr != vm_->heapToObject_.End())
@@ -42,14 +58,17 @@ void JSMetrics::Capture()
             classname = ((Object*) itr->second_)->GetTypeName();
             classname = ((Object*) itr->second_)->GetTypeName();
         }
         }
 
 
-        if (!classNames_.Contains(classname))
+        if (!objectMetrics_.Contains(classname))
         {
         {
-            classNames_.Push(classname);
-            classInstances_[classname] = 1;
+            JSMetrics::ObjectMetric metric;
+            metric.classname = classname;
+            metric.count = 1;
+
+            objectMetrics_[classname] = metric;
         }
         }
         else
         else
         {
         {
-            classInstances_[classname]++;
+            objectMetrics_[classname].count++;
         }
         }
 
 
         itr++;
         itr++;

+ 7 - 3
Source/AtomicJS/Javascript/JSMetrics.h

@@ -17,6 +17,12 @@ class JSMetrics : public Object
 {
 {
     OBJECT(JSMetrics);
     OBJECT(JSMetrics);
 
 
+    struct ObjectMetric
+    {
+        String classname;
+        int count;
+    };
+
 public:
 public:
 
 
     /// Construct.
     /// Construct.
@@ -25,7 +31,6 @@ public:
     virtual ~JSMetrics();
     virtual ~JSMetrics();
 
 
     void Capture();
     void Capture();
-
     void Dump();
     void Dump();
 
 
 private:
 private:
@@ -33,8 +38,7 @@ private:
     WeakPtr<JSVM> vm_;
     WeakPtr<JSVM> vm_;
 
 
     // Object
     // Object
-    List<String> classNames_;
-    HashMap<StringHash, int> classInstances_;
+    HashMap<StringHash, ObjectMetric> objectMetrics_;
 
 
 };
 };