mirror of
https://github.com/mhx/dwarfs.git
synced 2025-09-08 03:49:44 -04:00
feat(metadata_v2): more complete metadata breakdown
This commit is contained in:
parent
3a49825eca
commit
4cbc96293d
@ -176,40 +176,50 @@ void analyze_frozen(std::ostream& os,
|
|||||||
#define DWARFS_FMT_L "n"
|
#define DWARFS_FMT_L "n"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
auto fmt_size = [&](auto const& name, size_t count, size_t size) {
|
auto fmt_size = [&](std::string_view name, std::optional<size_t> count_opt,
|
||||||
return fmt::format("{0:>14" DWARFS_FMT_L "} {1:.<20}{2:.>16" DWARFS_FMT_L
|
size_t size) {
|
||||||
|
auto count = count_opt.value_or(1);
|
||||||
|
std::string count_str;
|
||||||
|
if (count_opt.has_value()) {
|
||||||
|
count_str = fmt::format("{0:" DWARFS_FMT_L "}", count);
|
||||||
|
}
|
||||||
|
return fmt::format("{0:>14} {1:.<24}{2:.>16" DWARFS_FMT_L
|
||||||
"} bytes {3:5.1f}% {4:5.1f} bytes/item\n",
|
"} bytes {3:5.1f}% {4:5.1f} bytes/item\n",
|
||||||
count, name, size, 100.0 * size / total_size,
|
count_str, name, size, 100.0 * size / total_size,
|
||||||
count > 0 ? static_cast<double>(size) / count : 0.0);
|
count > 0 ? static_cast<double>(size) / count : 0.0);
|
||||||
};
|
};
|
||||||
|
|
||||||
auto fmt_detail = [&](auto const& name, size_t count, size_t size,
|
auto fmt_detail = [&](std::string_view name, size_t count, size_t size,
|
||||||
std::string num) {
|
std::string num) {
|
||||||
return fmt::format(
|
return fmt::format(
|
||||||
" {0:<20}{1:>16" DWARFS_FMT_L "} bytes {2:>6} "
|
" {0:<24}{1:>16" DWARFS_FMT_L "} bytes {2:>6} "
|
||||||
"{3:5.1f} bytes/item\n",
|
"{3:5.1f} bytes/item\n",
|
||||||
name, size, num, count > 0 ? static_cast<double>(size) / count : 0.0);
|
name, size, num, count > 0 ? static_cast<double>(size) / count : 0.0);
|
||||||
};
|
};
|
||||||
|
|
||||||
auto fmt_detail_pct = [&](auto const& name, size_t count, size_t size) {
|
auto fmt_detail_pct = [&](std::string_view name, size_t count, size_t size) {
|
||||||
return fmt_detail(name, count, size,
|
return fmt_detail(name, count, size,
|
||||||
fmt::format("{0:5.1f}%", 100.0 * size / total_size));
|
fmt::format("{0:5.1f}%", 100.0 * size / total_size));
|
||||||
};
|
};
|
||||||
|
|
||||||
auto add_size = [&](auto const& name, size_t count, size_t size) {
|
auto add_size = [&](std::string_view name, size_t count, size_t size) {
|
||||||
usage.emplace_back(size, fmt_size(name, count, size));
|
usage.emplace_back(size, fmt_size(name, count, size));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
auto add_size_unique = [&](std::string_view name, size_t size) {
|
||||||
|
usage.emplace_back(size, fmt_size(name, std::nullopt, size));
|
||||||
|
};
|
||||||
|
|
||||||
auto list_size = [&](auto const& list, auto const& field) {
|
auto list_size = [&](auto const& list, auto const& field) {
|
||||||
return (list.size() * field.layout.itemField.layout.bits + 7) / 8;
|
return (list.size() * field.layout.itemField.layout.bits + 7) / 8;
|
||||||
};
|
};
|
||||||
|
|
||||||
auto add_list_size = [&](auto const& name, auto const& list,
|
auto add_list_size = [&](std::string_view name, auto const& list,
|
||||||
auto const& field) {
|
auto const& field) {
|
||||||
add_size(name, list.size(), list_size(list, field));
|
add_size(name, list.size(), list_size(list, field));
|
||||||
};
|
};
|
||||||
|
|
||||||
auto add_string_list_size = [&](auto const& name, auto const& list,
|
auto add_string_list_size = [&](std::string_view name, auto const& list,
|
||||||
auto const& field) {
|
auto const& field) {
|
||||||
auto count = list.size();
|
auto count = list.size();
|
||||||
if (count > 0) {
|
if (count > 0) {
|
||||||
@ -223,7 +233,7 @@ void analyze_frozen(std::ostream& os,
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
auto add_string_table_size = [&](auto const& name, auto const& table,
|
auto add_string_table_size = [&](std::string_view name, auto const& table,
|
||||||
auto const& field) {
|
auto const& field) {
|
||||||
if (auto data_size = table.buffer().size(); data_size > 0) {
|
if (auto data_size = table.buffer().size(); data_size > 0) {
|
||||||
auto dict_size =
|
auto dict_size =
|
||||||
@ -274,9 +284,42 @@ void analyze_frozen(std::ostream& os,
|
|||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
#define META_ADD_DETAIL_BITS(field, x) \
|
||||||
|
do { \
|
||||||
|
if (auto bits = \
|
||||||
|
l->field##Field.layout.itemField.layout.x##Field.layout.bits; \
|
||||||
|
bits > 0) { \
|
||||||
|
detail_bits.emplace_back(#x, bits); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
META_LIST_SIZE(chunks);
|
META_LIST_SIZE(chunks);
|
||||||
META_LIST_SIZE(directories);
|
META_LIST_SIZE(directories);
|
||||||
META_LIST_SIZE(inodes);
|
|
||||||
|
{
|
||||||
|
std::vector<std::pair<std::string_view, size_t>> detail_bits;
|
||||||
|
|
||||||
|
META_ADD_DETAIL_BITS(inodes, mode_index);
|
||||||
|
META_ADD_DETAIL_BITS(inodes, owner_index);
|
||||||
|
META_ADD_DETAIL_BITS(inodes, group_index);
|
||||||
|
META_ADD_DETAIL_BITS(inodes, atime_offset);
|
||||||
|
META_ADD_DETAIL_BITS(inodes, mtime_offset);
|
||||||
|
META_ADD_DETAIL_BITS(inodes, ctime_offset);
|
||||||
|
|
||||||
|
auto count = meta.inodes().size();
|
||||||
|
auto size = list_size(meta.inodes(), l->inodesField);
|
||||||
|
auto fmt = fmt_size("inodes", count, size);
|
||||||
|
|
||||||
|
for (size_t i = 0; i < detail_bits.size(); ++i) {
|
||||||
|
auto [name, bits] = detail_bits[i];
|
||||||
|
auto tree = i == detail_bits.size() - 1 ? "'" : "|";
|
||||||
|
fmt += fmt_detail_pct(fmt::format("{}- {}", tree, name), count,
|
||||||
|
(count * bits + 7) / 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
usage.emplace_back(size, fmt);
|
||||||
|
}
|
||||||
|
|
||||||
META_LIST_SIZE(chunk_table);
|
META_LIST_SIZE(chunk_table);
|
||||||
if (!meta.entry_table_v2_2().empty()) {
|
if (!meta.entry_table_v2_2().empty()) {
|
||||||
// deprecated, so only list if non-empty
|
// deprecated, so only list if non-empty
|
||||||
@ -308,6 +351,7 @@ void analyze_frozen(std::ostream& os,
|
|||||||
#undef META_STRING_LIST_SIZE
|
#undef META_STRING_LIST_SIZE
|
||||||
#undef META_OPT_LIST_SIZE
|
#undef META_OPT_LIST_SIZE
|
||||||
#undef META_OPT_STRING_TABLE_SIZE
|
#undef META_OPT_STRING_TABLE_SIZE
|
||||||
|
#undef META_ADD_DETAIL_BITS
|
||||||
|
|
||||||
if (auto cache = meta.reg_file_size_cache()) {
|
if (auto cache = meta.reg_file_size_cache()) {
|
||||||
add_list_size(
|
add_list_size(
|
||||||
@ -315,12 +359,18 @@ void analyze_frozen(std::ostream& os,
|
|||||||
l->reg_file_size_cacheField.layout.valueField.layout.lookupField);
|
l->reg_file_size_cacheField.layout.valueField.layout.lookupField);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (auto version = meta.dwarfs_version()) {
|
||||||
|
add_size_unique("dwarfs_version", version->size());
|
||||||
|
}
|
||||||
|
|
||||||
|
add_size_unique("metadata_root", l->size);
|
||||||
|
|
||||||
std::ranges::sort(usage, [](auto const& a, auto const& b) {
|
std::ranges::sort(usage, [](auto const& a, auto const& b) {
|
||||||
return a.first > b.first || (a.first == b.first && a.second < b.second);
|
return a.first > b.first || (a.first == b.first && a.second < b.second);
|
||||||
});
|
});
|
||||||
|
|
||||||
os << "metadata memory usage:\n";
|
os << "metadata memory usage:\n";
|
||||||
os << fmt::format(" {0:.<20}{1:.>16" DWARFS_FMT_L
|
os << fmt::format(" {0:.<24}{1:.>16" DWARFS_FMT_L
|
||||||
"} bytes {2:6.1f} bytes/inode\n",
|
"} bytes {2:6.1f} bytes/inode\n",
|
||||||
"total metadata", total_size,
|
"total metadata", total_size,
|
||||||
static_cast<double>(total_size) / meta.inodes().size());
|
static_cast<double>(total_size) / meta.inodes().size());
|
||||||
|
Loading…
x
Reference in New Issue
Block a user