JSMetrics.cpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. #include <Atomic/Container/Sort.h>
  2. #include <Atomic/Scene/Node.h>
  3. #include "JSVM.h"
  4. #include "JSComponent.h"
  5. #include "JSMetrics.h"
  6. namespace Atomic
  7. {
  8. JSMetrics::JSMetrics(Context* context, JSVM *vm) : Object(context),
  9. vm_(vm)
  10. {
  11. }
  12. JSMetrics::~JSMetrics()
  13. {
  14. }
  15. static bool CompareObjectMetrics(const JSMetrics::ObjectMetric& lhs, const JSMetrics::ObjectMetric& rhs)
  16. {
  17. return lhs.count > rhs.count;
  18. }
  19. static bool CompareNodeMetrics(const JSMetrics::NodeMetric& lhs, const JSMetrics::NodeMetric& rhs)
  20. {
  21. return lhs.count > rhs.count;
  22. }
  23. void JSMetrics::Dump()
  24. {
  25. Vector<ObjectMetric> sorted;
  26. HashMap<StringHash, ObjectMetric>::ConstIterator itr = objectMetrics_.Begin();
  27. while (itr != objectMetrics_.End())
  28. {
  29. sorted.Push(itr->second_);
  30. itr++;
  31. }
  32. Sort(sorted.Begin(), sorted.End(), CompareObjectMetrics);
  33. Vector<ObjectMetric>::ConstIterator vitr = sorted.Begin();
  34. while (vitr != sorted.End())
  35. {
  36. const String& classname = (*vitr).classname;
  37. LOGINFOF("%s %i", classname.CString(), objectMetrics_[classname].count);
  38. vitr++;
  39. }
  40. }
  41. void JSMetrics::DumpNodes()
  42. {
  43. Vector<NodeMetric> sorted;
  44. HashMap<StringHash, NodeMetric>::ConstIterator itr = nodeMetrics_.Begin();
  45. while (itr != nodeMetrics_.End())
  46. {
  47. sorted.Push(itr->second_);
  48. itr++;
  49. }
  50. Sort(sorted.Begin(), sorted.End(), CompareNodeMetrics);
  51. Vector<NodeMetric>::ConstIterator vitr = sorted.Begin();
  52. while (vitr != sorted.End())
  53. {
  54. const String& nodename = (*vitr).name;
  55. LOGINFOF("%s %i", nodename.CString(), nodeMetrics_[nodename].count);
  56. vitr++;
  57. }
  58. }
  59. void JSMetrics::DumpJSComponents()
  60. {
  61. Vector<String> jsnames;
  62. HashMap<StringHash, int> jscomponents;
  63. HashMap<void*, RefCounted*>::ConstIterator itr = vm_->heapToObject_.Begin();
  64. while (itr != vm_->heapToObject_.End())
  65. {
  66. String classname = "RefCounted";
  67. if (itr->second_->IsObject())
  68. {
  69. classname = ((Object*) itr->second_)->GetTypeName();
  70. }
  71. /*
  72. if (classname == "JSComponent")
  73. {
  74. JSComponent* jsc = (JSComponent*) itr->second_;
  75. const String& classname = jsc->GetClassName();
  76. if (jsc->GetDestroyed())
  77. {
  78. // this is an error
  79. LOGINFOF("Destroyed: %s Node: %p JSHeapPtr: %p", jsc->GetClassName().CString(), (void*) jsc->GetNode(), (void*) jsc->JSGetHeapPtr());
  80. }
  81. if (!jscomponents.Contains(classname))
  82. {
  83. jsnames.Push(classname);
  84. jscomponents[classname] = 1;
  85. }
  86. else
  87. jscomponents[classname]++;
  88. }
  89. */
  90. itr++;
  91. }
  92. for (unsigned i = 0; i < jsnames.Size(); i++)
  93. {
  94. const String& classname = jsnames[i];
  95. LOGINFOF("%s %i", classname.CString(), jscomponents[classname]);
  96. }
  97. }
  98. void JSMetrics::Capture()
  99. {
  100. objectMetrics_.Clear();
  101. nodeMetrics_.Clear();
  102. // run twice to call finalizers
  103. // see duktape docs
  104. duk_gc(vm_->GetJSContext(), 0);
  105. duk_gc(vm_->GetJSContext(), 0);
  106. HashMap<void*, RefCounted*>::ConstIterator itr = vm_->heapToObject_.Begin();
  107. while (itr != vm_->heapToObject_.End())
  108. {
  109. String classname = "RefCounted";
  110. if (itr->second_->IsObject())
  111. {
  112. classname = ((Object*) itr->second_)->GetTypeName();
  113. if (classname == "Node")
  114. {
  115. String nodename = ((Node*) itr->second_)->GetName();
  116. if (nodename == String::EMPTY)
  117. {
  118. nodename = String("(Anonymous)");
  119. }
  120. if (!nodeMetrics_.Contains(nodename))
  121. {
  122. JSMetrics::NodeMetric metric;
  123. metric.name = nodename;
  124. metric.count = 1;
  125. nodeMetrics_[nodename] = metric;
  126. }
  127. else
  128. {
  129. nodeMetrics_[nodename].count++;
  130. }
  131. }
  132. }
  133. if (!objectMetrics_.Contains(classname))
  134. {
  135. JSMetrics::ObjectMetric metric;
  136. metric.classname = classname;
  137. metric.count = 1;
  138. objectMetrics_[classname] = metric;
  139. }
  140. else
  141. {
  142. objectMetrics_[classname].count++;
  143. }
  144. itr++;
  145. }
  146. }
  147. }