static void outputLifetimeByType(FILE* file, unsigned initialHeap) { assert(initialHeap < AugHeapKinds); fprintf(file, "# Lifetime of %s things (in log2 bins) by type\n", heapName(initialHeap)); fprintf(file, "# NB invalid unless execution was traced with appropriate zeal\n"); fprintf(file, "# Total allocations: %" PRIu64 "\n", allocCount); // There are many types but few are frequently used. const size_t minObjectCount = 1; const size_t outputEntries = 10; std::vector<TypeId> topTypes; for (size_t i = 0; i < types.size(); ++i) { if (objectCountByType.at(i) > minObjectCount) topTypes.push_back(i); } std::sort(topTypes.begin(), topTypes.end(), [] (TypeId a, TypeId b) { return objectCountByType.at(a) > objectCountByType.at(b); }); size_t count = std::min(outputEntries, topTypes.size()); fprintf(file, "Lifetime"); for (unsigned i = 0; i < count; ++i) fprintf(file, ", %15s", types[topTypes[i]].getName()); fprintf(file, "\n"); for (unsigned i = 0; i < lifetimeBins; ++i) { fprintf(file, "%8d", binLimit(i)); for (unsigned j = 0; j < count; ++j) fprintf(file, ", %8" PRIu64, objectCountByTypeHeapAndLifetime.at(topTypes[j])[initialHeap][i]); fprintf(file, "\n"); } }
static void outputLifetimeByClass(FILE* file, unsigned initialHeap) { assert(initialHeap < AugHeapKinds); fprintf(file, "# Lifetime of %s things (in log2 bins) by class\n", heapName(initialHeap)); fprintf(file, "# NB invalid unless execution was traced with appropriate zeal\n"); fprintf(file, "# Total allocations: %" PRIu64 "\n", allocCount); fprintf(file, "Lifetime"); for (unsigned i = 0; i < classes.size(); ++i) fprintf(file, ", %15s", classes[i].name); fprintf(file, "\n"); for (unsigned i = 0; i < lifetimeBins; ++i) { fprintf(file, "%8d", binLimit(i)); for (unsigned j = 0; j < classes.size(); ++j) fprintf(file, ", %8" PRIu64, objectCountByHeapClassAndLifetime[initialHeap][j][i]); fprintf(file, "\n"); } }
void AbstractField::dump(PrintStream& out) const { out.print(heapName(), "(", m_offset, ")"); if (parent()) out.print("->", *parent()); }