OLD | NEW |
---|---|
(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 | |
OLD | NEW |