JSMetrics.cpp 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #include <Atomic/Container/Sort.h>
  2. #include "JSVM.h"
  3. #include "JSMetrics.h"
  4. namespace Atomic
  5. {
  6. JSMetrics::JSMetrics(Context* context, JSVM *vm) : Object(context),
  7. vm_(vm)
  8. {
  9. }
  10. JSMetrics::~JSMetrics()
  11. {
  12. }
  13. static bool CompareObjectMetrics(const JSMetrics::ObjectMetric& lhs, const JSMetrics::ObjectMetric& rhs)
  14. {
  15. return lhs.count > rhs.count;
  16. }
  17. void JSMetrics::Dump()
  18. {
  19. Vector<ObjectMetric> sorted;
  20. HashMap<StringHash, ObjectMetric>::ConstIterator itr = objectMetrics_.Begin();
  21. while (itr != objectMetrics_.End())
  22. {
  23. sorted.Push(itr->second_);
  24. itr++;
  25. }
  26. Sort(sorted.Begin(), sorted.End(), CompareObjectMetrics);
  27. Vector<ObjectMetric>::ConstIterator vitr = sorted.Begin();
  28. while (vitr != sorted.End())
  29. {
  30. const String& classname = (*vitr).classname;
  31. LOGINFOF("%s %i", classname.CString(), objectMetrics_[classname].count);
  32. vitr++;
  33. }
  34. }
  35. void JSMetrics::Capture()
  36. {
  37. objectMetrics_.Clear();
  38. HashMap<void*, RefCounted*>::ConstIterator itr = vm_->heapToObject_.Begin();
  39. while (itr != vm_->heapToObject_.End())
  40. {
  41. String classname = "RefCounted";
  42. if (itr->second_->IsObject())
  43. {
  44. classname = ((Object*) itr->second_)->GetTypeName();
  45. }
  46. if (!objectMetrics_.Contains(classname))
  47. {
  48. JSMetrics::ObjectMetric metric;
  49. metric.classname = classname;
  50. metric.count = 1;
  51. objectMetrics_[classname] = metric;
  52. }
  53. else
  54. {
  55. objectMetrics_[classname].count++;
  56. }
  57. itr++;
  58. }
  59. }
  60. }