OLD | NEW |
---|---|
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <limits> | 5 #include <limits> |
6 #include <memory> | |
6 #include <string> | 7 #include <string> |
7 | 8 |
8 #include "base/bind.h" | 9 #include "base/bind.h" |
9 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
10 #include "base/files/file_enumerator.h" | 11 #include "base/files/file_enumerator.h" |
11 #include "base/files/file_path.h" | 12 #include "base/files/file_path.h" |
12 #include "base/hash.h" | 13 #include "base/hash.h" |
13 #include "base/process/process_metrics.h" | 14 #include "base/process/process_metrics.h" |
14 #include "base/rand_util.h" | 15 #include "base/rand_util.h" |
15 #include "base/run_loop.h" | 16 #include "base/run_loop.h" |
(...skipping 11 matching lines...) Expand all Loading... | |
27 #include "net/disk_cache/disk_cache_test_base.h" | 28 #include "net/disk_cache/disk_cache_test_base.h" |
28 #include "net/disk_cache/disk_cache_test_util.h" | 29 #include "net/disk_cache/disk_cache_test_util.h" |
29 #include "net/disk_cache/simple/simple_backend_impl.h" | 30 #include "net/disk_cache/simple/simple_backend_impl.h" |
30 #include "testing/gtest/include/gtest/gtest.h" | 31 #include "testing/gtest/include/gtest/gtest.h" |
31 #include "testing/platform_test.h" | 32 #include "testing/platform_test.h" |
32 | 33 |
33 using base::Time; | 34 using base::Time; |
34 | 35 |
35 namespace { | 36 namespace { |
36 | 37 |
38 const size_t kNumEntries = 1000; | |
39 const int kHeadersSize = 800; | |
40 const int kBodySize = 256 * 1024 - 1; | |
41 | |
42 const int kChunkSize = 64 * 1024; | |
jkarlin
2017/01/11 16:40:47
Is this based on our actual write size?
| |
43 const int kMaxParallelOperations = 8; | |
jkarlin
2017/01/11 16:40:47
10 is what the ResourceScheduler maxes at per tab.
| |
44 | |
37 size_t MaybeGetMaxFds() { | 45 size_t MaybeGetMaxFds() { |
38 #if defined(OS_POSIX) | 46 #if defined(OS_POSIX) |
39 return base::GetMaxFds(); | 47 return base::GetMaxFds(); |
40 #else | 48 #else |
41 return std::numeric_limits<size_t>::max(); | 49 return std::numeric_limits<size_t>::max(); |
42 #endif | 50 #endif |
43 } | 51 } |
44 | 52 |
45 void MaybeSetFdLimit(unsigned int max_descriptors) { | 53 void MaybeSetFdLimit(unsigned int max_descriptors) { |
46 #if defined(OS_POSIX) | 54 #if defined(OS_POSIX) |
47 base::SetFdLimit(max_descriptors); | 55 base::SetFdLimit(max_descriptors); |
48 #endif | 56 #endif |
49 } | 57 } |
50 | 58 |
51 struct TestEntry { | 59 struct TestEntry { |
52 std::string key; | 60 std::string key; |
53 int data_len; | 61 int data_len; |
54 }; | 62 }; |
55 | 63 |
64 enum class WhatToRead { | |
65 HEADERS_ONLY, | |
66 HEADERS_AND_BODY, | |
67 }; | |
68 | |
56 class DiskCachePerfTest : public DiskCacheTestWithCache { | 69 class DiskCachePerfTest : public DiskCacheTestWithCache { |
57 public: | 70 public: |
58 DiskCachePerfTest() : saved_fd_limit_(MaybeGetMaxFds()) { | 71 DiskCachePerfTest() { |
59 if (saved_fd_limit_ < kFdLimitForCacheTests) | 72 if (saved_fd_limit_ < kFdLimitForCacheTests) |
60 MaybeSetFdLimit(kFdLimitForCacheTests); | 73 MaybeSetFdLimit(kFdLimitForCacheTests); |
61 } | 74 } |
62 | 75 |
63 ~DiskCachePerfTest() override { | 76 ~DiskCachePerfTest() override { |
64 if (saved_fd_limit_ < kFdLimitForCacheTests) | 77 if (saved_fd_limit_ < kFdLimitForCacheTests) |
65 MaybeSetFdLimit(saved_fd_limit_); | 78 MaybeSetFdLimit(saved_fd_limit_); |
66 } | 79 } |
67 | 80 |
81 const std::vector<TestEntry>& entries() const { return entries_; } | |
82 | |
68 protected: | 83 protected: |
69 enum class WhatToRead { | |
70 HEADERS_ONLY, | |
71 HEADERS_AND_BODY, | |
72 }; | |
73 | 84 |
74 // Helper methods for constructing tests. | 85 // Helper methods for constructing tests. |
75 bool TimeWrite(); | 86 bool TimeWrites(); |
76 bool TimeRead(WhatToRead what_to_read, const char* timer_message); | 87 bool TimeReads(WhatToRead what_to_read, const char* timer_message); |
77 void ResetAndEvictSystemDiskCache(); | 88 void ResetAndEvictSystemDiskCache(); |
78 | 89 |
90 // Callbacks used within tests for intermediate operations. | |
91 void WriteCallback(const net::CompletionCallback& final_callback, | |
92 scoped_refptr<net::IOBuffer> headers_buffer, | |
93 scoped_refptr<net::IOBuffer> body_buffer, | |
94 disk_cache::Entry* cache_entry, | |
95 int entry_index, | |
96 size_t write_offset, | |
97 int result); | |
98 | |
79 // Complete perf tests. | 99 // Complete perf tests. |
80 void CacheBackendPerformance(); | 100 void CacheBackendPerformance(); |
81 | 101 |
82 const size_t kFdLimitForCacheTests = 8192; | 102 const size_t kFdLimitForCacheTests = 8192; |
83 | 103 |
84 const int kNumEntries = 1000; | |
85 const int kHeadersSize = 800; | |
86 const int kBodySize = 256 * 1024 - 1; | |
87 | |
88 std::vector<TestEntry> entries_; | 104 std::vector<TestEntry> entries_; |
89 | 105 |
106 size_t next_entry_ = 0; // Which entry will be the next entry to read/write. | |
107 size_t pending_operations_count_ = 0; | |
108 int pending_result_; | |
109 | |
90 private: | 110 private: |
91 const size_t saved_fd_limit_; | 111 const size_t saved_fd_limit_ = MaybeGetMaxFds(); |
92 }; | 112 }; |
93 | 113 |
94 // Creates num_entries on the cache, and writes kHeaderSize bytes of metadata | 114 class WriteHandler { |
jkarlin
2017/01/11 16:40:47
Please add some docs for this class.
| |
95 // and up to kBodySize of data to each entry. | 115 public: |
96 bool DiskCachePerfTest::TimeWrite() { | 116 WriteHandler(const DiskCachePerfTest* test, |
97 // TODO(gavinp): This test would be significantly more realistic if it didn't | 117 disk_cache::Backend* cache, |
98 // do single reads and writes. Perhaps entries should be written 64kb at a | 118 net::CompletionCallback final_callback) |
99 // time. As well, not all entries should be created and written essentially | 119 : test_(test), cache_(cache), final_callback_(final_callback) { |
100 // simultaneously; some number of entries in flight at a time would be a | 120 CacheTestFillBuffer(headers_buffer_->data(), kHeadersSize, false); |
101 // likely better testing load. | 121 CacheTestFillBuffer(body_buffer_->data(), kChunkSize, false); |
102 scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kHeadersSize)); | 122 } |
103 scoped_refptr<net::IOBuffer> buffer2(new net::IOBuffer(kBodySize)); | 123 |
104 | 124 void Run(); |
105 CacheTestFillBuffer(buffer1->data(), kHeadersSize, false); | 125 |
106 CacheTestFillBuffer(buffer2->data(), kBodySize, false); | 126 protected: |
107 | 127 void CreateNextEntry(); |
108 int expected = 0; | 128 |
109 | 129 void CreateCallback(std::unique_ptr<disk_cache::Entry*> unique_entry_ptr, |
110 MessageLoopHelper helper; | 130 int data_len, |
111 CallbackTest callback(&helper, true); | 131 int result); |
112 | 132 void WriteDataCallback(disk_cache::Entry* entry, |
113 base::PerfTimeLogger timer("Write disk cache entries"); | 133 int next_offset, |
114 | 134 int data_len, |
135 int expected_result, | |
136 int result); | |
137 | |
138 private: | |
139 bool CheckForErrorAndCancel(int result); | |
140 | |
141 const DiskCachePerfTest* test_; | |
142 disk_cache::Backend* cache_; | |
143 net::CompletionCallback final_callback_; | |
144 | |
145 size_t next_entry_index_ = 0; | |
146 size_t pending_operations_count_ = 0; | |
147 | |
148 int pending_result_ = net::OK; | |
149 | |
150 scoped_refptr<net::IOBuffer> headers_buffer_ = | |
151 new net::IOBuffer(kHeadersSize); | |
152 scoped_refptr<net::IOBuffer> body_buffer_ = new net::IOBuffer(kChunkSize); | |
153 }; | |
jkarlin
2017/01/11 16:40:47
DISALLOW_COPY_AND_ASSIGN
| |
154 | |
155 void WriteHandler::Run() { | |
156 for (int i = 0; i < kMaxParallelOperations; ++i) { | |
157 ++pending_operations_count_; | |
158 CreateNextEntry(); | |
159 } | |
160 } | |
161 | |
162 void WriteHandler::CreateNextEntry() { | |
163 EXPECT_GT(kNumEntries, next_entry_index_); | |
164 TestEntry test_entry = test_->entries()[next_entry_index_++]; | |
165 disk_cache::Entry** entry_ptr = new disk_cache::Entry*(); | |
166 std::unique_ptr<disk_cache::Entry*> unique_entry_ptr(entry_ptr); | |
167 net::CompletionCallback callback = | |
168 base::Bind(&WriteHandler::CreateCallback, base::Unretained(this), | |
169 base::Passed(&unique_entry_ptr), test_entry.data_len); | |
170 int result = cache_->CreateEntry(test_entry.key, entry_ptr, callback); | |
171 if (result != net::ERR_IO_PENDING) | |
172 callback.Run(result); | |
173 } | |
174 | |
175 void WriteHandler::CreateCallback(std::unique_ptr<disk_cache::Entry*> entry_ptr, | |
176 int data_len, | |
177 int result) { | |
178 if (CheckForErrorAndCancel(result)) | |
179 return; | |
180 | |
181 disk_cache::Entry* entry = *(entry_ptr.get()); | |
182 | |
183 net::CompletionCallback callback = | |
184 base::Bind(&WriteHandler::WriteDataCallback, base::Unretained(this), | |
185 entry, 0, data_len, kHeadersSize); | |
186 int new_result = entry->WriteData(0, 0, headers_buffer_.get(), kHeadersSize, | |
187 callback, false); | |
188 if (new_result != net::ERR_IO_PENDING) | |
189 callback.Run(new_result); | |
190 } | |
191 | |
192 void WriteHandler::WriteDataCallback(disk_cache::Entry* entry, | |
193 int next_offset, | |
194 int data_len, | |
195 int expected_result, | |
196 int result) { | |
197 if (CheckForErrorAndCancel(result)) { | |
198 entry->Close(); | |
199 return; | |
200 } | |
201 if (next_offset >= data_len) { | |
202 entry->Close(); | |
203 if (next_entry_index_ < kNumEntries) { | |
204 CreateNextEntry(); | |
205 } else { | |
206 --pending_operations_count_; | |
207 if (pending_operations_count_ == 0) | |
208 final_callback_.Run(net::OK); | |
209 } | |
210 return; | |
211 } | |
212 | |
213 int write_size = std::min(kChunkSize, data_len - next_offset); | |
214 net::CompletionCallback callback = | |
215 base::Bind(&WriteHandler::WriteDataCallback, base::Unretained(this), | |
216 entry, next_offset + write_size, data_len, write_size); | |
217 int new_result = entry->WriteData(1, next_offset, body_buffer_.get(), | |
218 write_size, callback, false); | |
219 if (new_result != net::ERR_IO_PENDING) | |
220 callback.Run(new_result); | |
221 } | |
222 | |
223 bool WriteHandler::CheckForErrorAndCancel(int result) { | |
224 DCHECK_NE(net::ERR_IO_PENDING, result); | |
225 if (result != net::OK && !(result > 0)) | |
226 pending_result_ = result; | |
227 if (pending_result_ != net::OK) { | |
228 --pending_operations_count_; | |
229 if (pending_operations_count_ == 0) | |
230 final_callback_.Run(pending_result_); | |
231 return true; | |
232 } | |
233 return false; | |
234 } | |
235 | |
236 class ReadHandler { | |
237 public: | |
238 ReadHandler(const DiskCachePerfTest* test, | |
239 WhatToRead what_to_read, | |
240 disk_cache::Backend* cache, | |
241 net::CompletionCallback final_callback) | |
242 : test_(test), | |
243 what_to_read_(what_to_read), | |
244 cache_(cache), | |
245 final_callback_(final_callback) { | |
246 for (int i = 0; i < kMaxParallelOperations; ++i) | |
247 read_buffers_[i] = new net::IOBuffer(std::max(kHeadersSize, kChunkSize)); | |
248 } | |
249 | |
250 void Run(); | |
251 | |
252 protected: | |
253 void OpenNextEntry(int parallel_operation_index); | |
254 | |
255 void OpenCallback(int parallel_operation_index, | |
256 std::unique_ptr<disk_cache::Entry*> unique_entry_ptr, | |
257 int data_len, | |
258 int result); | |
259 void ReadDataCallback(int parallel_operation_index, | |
260 disk_cache::Entry* entry, | |
261 int next_offset, | |
262 int data_len, | |
263 int expected_result, | |
264 int result); | |
265 | |
266 private: | |
267 bool CheckForErrorAndCancel(int result); | |
268 | |
269 const DiskCachePerfTest* test_; | |
270 const WhatToRead what_to_read_; | |
271 | |
272 disk_cache::Backend* cache_; | |
273 net::CompletionCallback final_callback_; | |
274 | |
275 size_t next_entry_index_ = 0; | |
276 size_t pending_operations_count_ = 0; | |
277 | |
278 int pending_result_ = net::OK; | |
279 | |
280 scoped_refptr<net::IOBuffer> read_buffers_[kMaxParallelOperations]; | |
281 }; | |
jkarlin
2017/01/11 16:40:47
DISALLOW_COPY_AND_ASSIGN
| |
282 | |
283 void ReadHandler::Run() { | |
284 for (int i = 0; i < kMaxParallelOperations; ++i) { | |
285 OpenNextEntry(pending_operations_count_); | |
286 ++pending_operations_count_; | |
287 } | |
288 } | |
289 | |
290 void ReadHandler::OpenNextEntry(int parallel_operation_index) { | |
291 EXPECT_GT(kNumEntries, next_entry_index_); | |
292 TestEntry test_entry = test_->entries()[next_entry_index_++]; | |
293 disk_cache::Entry** entry_ptr = new disk_cache::Entry*(); | |
294 std::unique_ptr<disk_cache::Entry*> unique_entry_ptr(entry_ptr); | |
295 net::CompletionCallback callback = | |
296 base::Bind(&ReadHandler::OpenCallback, base::Unretained(this), | |
297 parallel_operation_index, base::Passed(&unique_entry_ptr), | |
298 test_entry.data_len); | |
299 int result = cache_->OpenEntry(test_entry.key, entry_ptr, callback); | |
300 if (result != net::ERR_IO_PENDING) | |
301 callback.Run(result); | |
302 } | |
303 | |
304 void ReadHandler::OpenCallback(int parallel_operation_index, | |
305 std::unique_ptr<disk_cache::Entry*> entry_ptr, | |
306 int data_len, | |
307 int result) { | |
308 if (CheckForErrorAndCancel(result)) | |
309 return; | |
310 | |
311 disk_cache::Entry* entry = *(entry_ptr.get()); | |
jkarlin
2017/01/11 16:40:47
does *entry_ptr work instead of *(entry_ptr.get())
| |
312 | |
313 EXPECT_EQ(data_len, entry->GetDataSize(1)); | |
jkarlin
2017/01/11 16:40:47
Please use an enum or constant for the streams in
| |
314 | |
315 net::CompletionCallback callback = | |
316 base::Bind(&ReadHandler::ReadDataCallback, base::Unretained(this), | |
317 parallel_operation_index, entry, 0, data_len, kHeadersSize); | |
318 int new_result = | |
319 entry->ReadData(0, 0, read_buffers_[parallel_operation_index].get(), | |
320 kChunkSize, callback); | |
321 if (new_result != net::ERR_IO_PENDING) | |
322 callback.Run(new_result); | |
323 } | |
324 | |
325 void ReadHandler::ReadDataCallback(int parallel_operation_index, | |
326 disk_cache::Entry* entry, | |
327 int next_offset, | |
328 int data_len, | |
329 int expected_result, | |
330 int result) { | |
331 if (CheckForErrorAndCancel(result)) { | |
332 entry->Close(); | |
333 return; | |
334 } | |
335 if (what_to_read_ == WhatToRead::HEADERS_ONLY || next_offset >= data_len) { | |
336 entry->Close(); | |
337 if (next_entry_index_ < kNumEntries) { | |
338 OpenNextEntry(parallel_operation_index); | |
339 } else { | |
340 --pending_operations_count_; | |
341 if (pending_operations_count_ == 0) | |
342 final_callback_.Run(net::OK); | |
343 } | |
344 return; | |
345 } | |
346 | |
347 int expected_read_size = std::min(kChunkSize, data_len - next_offset); | |
348 net::CompletionCallback callback = | |
349 base::Bind(&ReadHandler::ReadDataCallback, base::Unretained(this), | |
350 parallel_operation_index, entry, next_offset + kChunkSize, | |
351 data_len, expected_read_size); | |
352 int new_result = entry->ReadData( | |
353 1, next_offset, read_buffers_[parallel_operation_index].get(), kChunkSize, | |
354 callback); | |
355 if (new_result != net::ERR_IO_PENDING) | |
356 callback.Run(new_result); | |
357 } | |
358 | |
359 bool ReadHandler::CheckForErrorAndCancel(int result) { | |
360 DCHECK_NE(net::ERR_IO_PENDING, result); | |
361 if (result != net::OK && !(result > 0)) | |
362 pending_result_ = result; | |
363 if (pending_result_ != net::OK) { | |
364 --pending_operations_count_; | |
365 if (pending_operations_count_ == 0) | |
366 final_callback_.Run(pending_result_); | |
367 return true; | |
368 } | |
369 return false; | |
370 } | |
371 | |
372 bool DiskCachePerfTest::TimeWrites() { | |
115 for (int i = 0; i < kNumEntries; i++) { | 373 for (int i = 0; i < kNumEntries; i++) { |
116 TestEntry entry; | 374 TestEntry entry; |
117 entry.key = GenerateKey(true); | 375 entry.key = GenerateKey(true); |
118 entry.data_len = base::RandInt(0, kBodySize); | 376 entry.data_len = base::RandInt(0, kBodySize); |
jkarlin
2017/01/11 16:40:47
We have a very good idea of body sizes read from t
| |
119 entries_.push_back(entry); | 377 entries_.push_back(entry); |
120 | 378 } |
121 disk_cache::Entry* cache_entry; | 379 |
122 net::TestCompletionCallback cb; | 380 net::TestCompletionCallback cb; |
123 int rv = cache_->CreateEntry(entry.key, &cache_entry, cb.callback()); | 381 |
124 if (net::OK != cb.GetResult(rv)) | 382 base::PerfTimeLogger timer("Write disk cache entries"); |
125 break; | 383 |
126 int ret = cache_entry->WriteData( | 384 std::unique_ptr<WriteHandler> write_handler( |
127 0, 0, buffer1.get(), kHeadersSize, | 385 new WriteHandler(this, cache_.get(), cb.callback())); |
128 base::Bind(&CallbackTest::Run, base::Unretained(&callback)), false); | 386 write_handler->Run(); |
129 if (net::ERR_IO_PENDING == ret) | 387 return cb.WaitForResult() == net::OK; |
130 expected++; | 388 } |
131 else if (kHeadersSize != ret) | 389 |
132 break; | 390 bool DiskCachePerfTest::TimeReads(WhatToRead what_to_read, |
133 | 391 const char* timer_message) { |
134 ret = cache_entry->WriteData( | |
135 1, 0, buffer2.get(), entry.data_len, | |
136 base::Bind(&CallbackTest::Run, base::Unretained(&callback)), false); | |
137 if (net::ERR_IO_PENDING == ret) | |
138 expected++; | |
139 else if (entry.data_len != ret) | |
140 break; | |
141 cache_entry->Close(); | |
142 } | |
143 | |
144 helper.WaitUntilCacheIoFinished(expected); | |
145 timer.Done(); | |
146 | |
147 return expected == helper.callbacks_called(); | |
148 } | |
149 | |
150 // Reads the data and metadata from each entry listed on |entries|. | |
151 bool DiskCachePerfTest::TimeRead(WhatToRead what_to_read, | |
152 const char* timer_message) { | |
153 scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kHeadersSize)); | |
154 scoped_refptr<net::IOBuffer> buffer2(new net::IOBuffer(kBodySize)); | |
155 | |
156 CacheTestFillBuffer(buffer1->data(), kHeadersSize, false); | |
157 CacheTestFillBuffer(buffer2->data(), kBodySize, false); | |
158 | |
159 int expected = 0; | |
160 | |
161 MessageLoopHelper helper; | |
162 CallbackTest callback(&helper, true); | |
163 | |
164 base::PerfTimeLogger timer(timer_message); | 392 base::PerfTimeLogger timer(timer_message); |
165 | 393 |
166 for (int i = 0; i < kNumEntries; i++) { | 394 net::TestCompletionCallback cb; |
167 disk_cache::Entry* cache_entry; | 395 std::unique_ptr<ReadHandler> read_handler( |
168 net::TestCompletionCallback cb; | 396 new ReadHandler(this, what_to_read, cache_.get(), cb.callback())); |
169 int rv = cache_->OpenEntry(entries_[i].key, &cache_entry, cb.callback()); | 397 read_handler->Run(); |
170 if (net::OK != cb.GetResult(rv)) | 398 return cb.WaitForResult() == net::OK; |
171 break; | |
172 int ret = cache_entry->ReadData( | |
173 0, 0, buffer1.get(), kHeadersSize, | |
174 base::Bind(&CallbackTest::Run, base::Unretained(&callback))); | |
175 if (net::ERR_IO_PENDING == ret) | |
176 expected++; | |
177 else if (kHeadersSize != ret) | |
178 break; | |
179 | |
180 if (what_to_read == WhatToRead::HEADERS_AND_BODY) { | |
181 ret = cache_entry->ReadData( | |
182 1, 0, buffer2.get(), entries_[i].data_len, | |
183 base::Bind(&CallbackTest::Run, base::Unretained(&callback))); | |
184 if (net::ERR_IO_PENDING == ret) | |
185 expected++; | |
186 else if (entries_[i].data_len != ret) | |
187 break; | |
188 } | |
189 | |
190 cache_entry->Close(); | |
191 } | |
192 | |
193 helper.WaitUntilCacheIoFinished(expected); | |
194 timer.Done(); | |
195 | |
196 return (expected == helper.callbacks_called()); | |
197 } | 399 } |
198 | 400 |
199 TEST_F(DiskCachePerfTest, BlockfileHashes) { | 401 TEST_F(DiskCachePerfTest, BlockfileHashes) { |
200 base::PerfTimeLogger timer("Hash disk cache keys"); | 402 base::PerfTimeLogger timer("Hash disk cache keys"); |
201 for (int i = 0; i < 300000; i++) { | 403 for (int i = 0; i < 300000; i++) { |
202 std::string key = GenerateKey(true); | 404 std::string key = GenerateKey(true); |
203 base::Hash(key); | 405 base::Hash(key); |
204 } | 406 } |
205 timer.Done(); | 407 timer.Done(); |
206 } | 408 } |
(...skipping 19 matching lines...) Expand all Loading... | |
226 } | 428 } |
227 ASSERT_TRUE(base::EvictFileFromSystemCache(cache_path_)); | 429 ASSERT_TRUE(base::EvictFileFromSystemCache(cache_path_)); |
228 #endif | 430 #endif |
229 | 431 |
230 DisableFirstCleanup(); | 432 DisableFirstCleanup(); |
231 InitCache(); | 433 InitCache(); |
232 } | 434 } |
233 | 435 |
234 void DiskCachePerfTest::CacheBackendPerformance() { | 436 void DiskCachePerfTest::CacheBackendPerformance() { |
235 InitCache(); | 437 InitCache(); |
236 EXPECT_TRUE(TimeWrite()); | 438 EXPECT_TRUE(TimeWrites()); |
237 | 439 |
238 disk_cache::SimpleBackendImpl::FlushWorkerPoolForTesting(); | 440 disk_cache::SimpleBackendImpl::FlushWorkerPoolForTesting(); |
239 base::RunLoop().RunUntilIdle(); | 441 base::RunLoop().RunUntilIdle(); |
240 | 442 |
241 ResetAndEvictSystemDiskCache(); | 443 ResetAndEvictSystemDiskCache(); |
242 EXPECT_TRUE(TimeRead(WhatToRead::HEADERS_ONLY, | 444 EXPECT_TRUE(TimeReads(WhatToRead::HEADERS_ONLY, |
243 "Read disk cache headers only (cold)")); | 445 "Read disk cache headers only (cold)")); |
244 EXPECT_TRUE(TimeRead(WhatToRead::HEADERS_ONLY, | 446 EXPECT_TRUE(TimeReads(WhatToRead::HEADERS_ONLY, |
245 "Read disk cache headers only (warm)")); | 447 "Read disk cache headers only (warm)")); |
246 | 448 |
247 disk_cache::SimpleBackendImpl::FlushWorkerPoolForTesting(); | 449 disk_cache::SimpleBackendImpl::FlushWorkerPoolForTesting(); |
248 base::RunLoop().RunUntilIdle(); | 450 base::RunLoop().RunUntilIdle(); |
249 | 451 |
250 ResetAndEvictSystemDiskCache(); | 452 ResetAndEvictSystemDiskCache(); |
251 EXPECT_TRUE( | 453 EXPECT_TRUE(TimeReads(WhatToRead::HEADERS_AND_BODY, |
252 TimeRead(WhatToRead::HEADERS_AND_BODY, "Read disk cache entries (cold)")); | 454 "Read disk cache entries (cold)")); |
253 EXPECT_TRUE( | 455 EXPECT_TRUE(TimeReads(WhatToRead::HEADERS_AND_BODY, |
254 TimeRead(WhatToRead::HEADERS_AND_BODY, "Read disk cache entries (warm)")); | 456 "Read disk cache entries (warm)")); |
255 | 457 |
256 disk_cache::SimpleBackendImpl::FlushWorkerPoolForTesting(); | 458 disk_cache::SimpleBackendImpl::FlushWorkerPoolForTesting(); |
257 base::RunLoop().RunUntilIdle(); | 459 base::RunLoop().RunUntilIdle(); |
258 } | 460 } |
259 | 461 |
260 TEST_F(DiskCachePerfTest, CacheBackendPerformance) { | 462 TEST_F(DiskCachePerfTest, CacheBackendPerformance) { |
261 CacheBackendPerformance(); | 463 CacheBackendPerformance(); |
262 } | 464 } |
263 | 465 |
264 TEST_F(DiskCachePerfTest, SimpleCacheBackendPerformance) { | 466 TEST_F(DiskCachePerfTest, SimpleCacheBackendPerformance) { |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
299 files.DeleteBlock(address[entry], false); | 501 files.DeleteBlock(address[entry], false); |
300 EXPECT_TRUE( | 502 EXPECT_TRUE( |
301 files.CreateBlock(disk_cache::RANKINGS, block_size, &address[entry])); | 503 files.CreateBlock(disk_cache::RANKINGS, block_size, &address[entry])); |
302 } | 504 } |
303 | 505 |
304 timer2.Done(); | 506 timer2.Done(); |
305 base::RunLoop().RunUntilIdle(); | 507 base::RunLoop().RunUntilIdle(); |
306 } | 508 } |
307 | 509 |
308 } // namespace | 510 } // namespace |
OLD | NEW |