Skip to content

Commit 6ee69aa

Browse files
hannes-steffenhagen-diffbluemartin
authored andcommitted
Add helper for showing memory usage of string container
1 parent 5c1440d commit 6ee69aa

File tree

2 files changed

+53
-0
lines changed

2 files changed

+53
-0
lines changed

src/util/string_container.cpp

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ Author: Daniel Kroening, [email protected]
1212
#include "string_container.h"
1313

1414
#include <cstring>
15+
#include <iostream>
16+
#include <numeric>
1517

1618
string_ptrt::string_ptrt(const char *_s):s(_s), len(strlen(_s))
1719
{
@@ -74,3 +76,36 @@ unsigned string_containert::get(const std::string &s)
7476

7577
return r;
7678
}
79+
80+
void string_container_statisticst::dump_on_stream(std::ostream &out) const
81+
{
82+
auto total_memory_usage = strings_memory_usage + vector_memory_usage +
83+
map_memory_usage + list_memory_usage;
84+
out << "String container statistics:"
85+
<< "\n string count: " << string_count
86+
<< "\n string memory usage: " << strings_memory_usage.to_string()
87+
<< "\n vector memory usage: " << vector_memory_usage.to_string()
88+
<< "\n map memory usage: " << map_memory_usage.to_string()
89+
<< "\n list memory usage: " << list_memory_usage.to_string()
90+
<< "\n total memory usage: " << total_memory_usage.to_string() << '\n';
91+
}
92+
93+
string_container_statisticst string_containert::compute_statistics() const
94+
{
95+
string_container_statisticst result;
96+
result.string_count = string_vector.size();
97+
result.vector_memory_usage = memory_sizet::from_bytes(
98+
sizeof(string_vector) +
99+
sizeof(string_vectort::value_type) * string_vector.capacity());
100+
result.strings_memory_usage = memory_sizet::from_bytes(std::accumulate(
101+
begin(string_vector),
102+
end(string_vector),
103+
std::size_t(0),
104+
[](std::size_t sz, const std::string *s) { return sz + s->capacity(); }));
105+
result.map_memory_usage = memory_sizet::from_bytes(
106+
sizeof(hash_table) + hash_table.size() * sizeof(hash_tablet::value_type));
107+
108+
result.list_memory_usage = memory_sizet::from_bytes(
109+
sizeof(string_list) + 2 * sizeof(void *) * string_list.size());
110+
return result;
111+
}

src/util/string_container.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ Author: Daniel Kroening, [email protected]
1616
#include <unordered_map>
1717
#include <vector>
1818

19+
#include "memory_units.h"
1920
#include "string_hash.h"
2021

2122
struct string_ptrt
@@ -44,6 +45,21 @@ class string_ptr_hash
4445
size_t operator()(const string_ptrt s) const { return hash_string(s.s); }
4546
};
4647

48+
/// Has estimated statistics about string container
49+
/// (estimated because this only uses public information,
50+
/// which disregards any internal control structures that
51+
/// might be in use)
52+
struct string_container_statisticst
53+
{
54+
std::size_t string_count;
55+
memory_sizet strings_memory_usage;
56+
memory_sizet vector_memory_usage;
57+
memory_sizet map_memory_usage;
58+
memory_sizet list_memory_usage;
59+
60+
void dump_on_stream(std::ostream &out) const;
61+
};
62+
4763
class string_containert
4864
{
4965
public:
@@ -73,6 +89,8 @@ class string_containert
7389
return *string_vector[no];
7490
}
7591

92+
string_container_statisticst compute_statistics() const;
93+
7694
protected:
7795
// the 'unsigned' ought to be size_t
7896
typedef std::unordered_map<string_ptrt, unsigned, string_ptr_hash>

0 commit comments

Comments
 (0)