Chromium Code Reviews| 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 |