Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(122)

Side by Side Diff: base/trace_event/estimate_memory_usage_unittest.cc

Issue 2440393002: [tracing] Implement composable memory usage estimators. (Closed)
Patch Set: Simplify tests Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "base/trace_event/estimate_memory_usage.h"
6
7 #include <stdlib.h>
8
9 #include "base/memory/ptr_util.h"
10 #include "base/strings/string16.h"
11 #include "testing/gtest/include/gtest/gtest.h"
12
13 namespace base {
14 namespace trace_event {
15
16 namespace {
17
18 // Test class with predictable memory usage.
19 class Data {
20 public:
21 explicit Data(size_t size = 17): size_(size) {
22 }
23
24 size_t size() const { return size_; }
25
26 size_t EstimateMemoryUsage() const {
27 return size_;
28 }
29
30 bool operator < (const Data& other) const {
31 return size_ < other.size_;
32 }
33 bool operator == (const Data& other) const {
34 return size_ == other.size_;
35 }
36
37 struct Hasher {
38 size_t operator () (const Data& data) const {
39 return data.size();
40 }
41 };
42
43 private:
44 size_t size_;
45 };
46
47 } // namespace
48
49 TEST(EstimateMemoryUsageTest, String) {
50 std::string string(777, 'a');
51 EXPECT_EQ(string.capacity() + 1, EstimateMemoryUsage(string));
52 }
53
54 TEST(EstimateMemoryUsageTest, String16) {
55 string16 string(777, 'a');
56 EXPECT_EQ(sizeof(char16) * (string.capacity() + 1),
57 EstimateMemoryUsage(string));
58 }
59
60 TEST(EstimateMemoryUsageTest, Arrays) {
61 // std::array
62 {
63 std::array<Data, 10> array;
64 EXPECT_EQ(170u, EstimateMemoryUsage(array));
65 }
66
67 // T[N]
68 {
69 Data array[10];
70 EXPECT_EQ(170u, EstimateMemoryUsage(array));
71 }
72
73 // C array
74 {
75 struct Item {
76 char payload[10];
77 };
78 Item* array = new Item[7];
79 EXPECT_EQ(70u, EstimateMemoryUsage(array, 7));
80 delete[] array;
81 }
82 }
83
84 TEST(EstimateMemoryUsageTest, UniquePtr) {
85 // Empty
86 {
87 std::unique_ptr<Data> ptr;
88 EXPECT_EQ(0u, EstimateMemoryUsage(ptr));
89 }
90
91 // Not empty
92 {
93 std::unique_ptr<Data> ptr(new Data());
94 EXPECT_EQ(25u, EstimateMemoryUsage(ptr));
95 }
96
97 // With a pointer
98 {
99 std::unique_ptr<Data*> ptr(new Data*());
100 EXPECT_EQ(8u, EstimateMemoryUsage(ptr));
Primiano Tucci (use gerrit) 2016/11/08 14:09:16 s/8u/sizeof(void*)/ ?
101 }
102
103 // With an array
104 {
105 struct Item {
106 int payload[10];
Primiano Tucci (use gerrit) 2016/11/08 14:09:16 s/int/uint32_t/ to keep it a bit more readable
107 };
108 std::unique_ptr<Item[]> ptr(new Item[7]);
109 EXPECT_EQ(280u, EstimateMemoryUsage(ptr, 7));
110 }
111 }
112
113 TEST(EstimateMemoryUsageTest, Vector) {
114 {
115 std::vector<Data> vector;
116 for (int i = 0; i != 1000; ++i) {
117 vector.push_back(Data(i));
118 }
119 EXPECT_EQ(507692u, EstimateMemoryUsage(vector));
120 }
121
122 // Capacity
123 {
124 struct POD {
125 short data;
126 };
127 std::vector<POD> vector;
128 vector.reserve(1000);
129 EXPECT_EQ(2000u, EstimateMemoryUsage(vector));
130 }
131 }
132
133 TEST(EstimateMemoryUsageTest, List) {
134 struct POD {
135 short data;
136 };
137 std::list<POD> list;
138 for (int i = 0; i != 1000; ++i) {
139 list.push_back(POD());
140 }
141 EXPECT_EQ(24000u, EstimateMemoryUsage(list));
142 }
143
144 TEST(EstimateMemoryUsageTest, Set) {
145 std::set<std::pair<int, Data>> set;
146 for (int i = 0; i != 1000; ++i) {
147 set.insert({i, Data(i)});
148 }
149 EXPECT_EQ(547500u, EstimateMemoryUsage(set));
150 }
151
152 TEST(EstimateMemoryUsageTest, MultiSet) {
153 std::multiset<bool> set;
154 for (int i = 0; i != 1000; ++i) {
155 set.insert((i & 1) != 0);
156 }
157 EXPECT_EQ(32000u, EstimateMemoryUsage(set));
158 }
159
160 TEST(EstimateMemoryUsageTest, Map) {
161 std::map<Data, int> map;
162 for (int i = 0; i != 1000; ++i) {
163 map.insert({Data(i), i});
164 }
165 EXPECT_EQ(547500u, EstimateMemoryUsage(map));
166 }
167
168 TEST(EstimateMemoryUsageTest, MultiMap) {
169 std::multimap<char, Data> map;
170 for (int i = 0; i != 1000; ++i) {
171 map.insert({static_cast<char>(i), Data(i)});
172 }
173 EXPECT_EQ(547500u, EstimateMemoryUsage(map));
174 }
175
176 TEST(EstimateMemoryUsageTest, UnorderedSet) {
177 std::unordered_set<Data, Data::Hasher> set;
178 for (int i = 0; i != 1000; ++i) {
179 set.insert(Data(i));
180 }
181 EXPECT_EQ(537428u, EstimateMemoryUsage(set));
182 }
183
184 TEST(EstimateMemoryUsageTest, UnorderedMultiSet) {
185 std::unordered_multiset<short> set;
186 for (int i = 0; i != 1000; ++i) {
187 set.insert(static_cast<short>(i));
188 }
189 EXPECT_EQ(37928u, EstimateMemoryUsage(set));
190 }
191
192 TEST(EstimateMemoryUsageTest, UnorderedMap) {
193 std::unordered_map<Data, void*, Data::Hasher> map;
194 for (int i = 0; i != 1000; ++i) {
195 map.insert({Data(i), reinterpret_cast<void*>(i)});
196 }
197 EXPECT_EQ(545428u, EstimateMemoryUsage(map));
198 }
199
200 TEST(EstimateMemoryUsageTest, UnorderedMultiMap) {
201 std::unordered_multimap<char, short> map;
202 for (int i = 0; i != 1000; ++i) {
203 map.insert({static_cast<char>(i), 777});
204 }
205 EXPECT_EQ(37928u, EstimateMemoryUsage(map));
206 }
207
208 } // namespace trace_event
209 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698