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

Unified Diff: net/disk_cache/disk_cache_perftest.cc

Issue 1976453003: Add headers-only component to DiskCachePerfTest. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@open-speeder-2
Patch Set: block fixes Created 4 years, 7 months 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/disk_cache/disk_cache_perftest.cc
diff --git a/net/disk_cache/disk_cache_perftest.cc b/net/disk_cache/disk_cache_perftest.cc
index 444b7c8fd3c46729fd645f9e705e9b39f29e11e9..798c38a8e923dac9f4f5d6601d14c656560f5583 100644
--- a/net/disk_cache/disk_cache_perftest.cc
+++ b/net/disk_cache/disk_cache_perftest.cc
@@ -29,30 +29,41 @@ using base::Time;
namespace {
-class DiskCachePerfTest : public DiskCacheTestWithCache {
- protected:
- void CacheBackendPerformance();
-};
-
struct TestEntry {
std::string key;
int data_len;
};
-typedef std::vector<TestEntry> TestEntries;
-const int kMaxSize = 16 * 1024 - 1;
+class DiskCachePerfTest : public DiskCacheTestWithCache {
+ protected:
+ enum class WhatToRead {
+ HEADERS_ONLY,
+ HEADERS_AND_BODY,
+ };
+
+ // Helper methods for constructing tests.
+ bool TimeWrite();
+ bool TimeRead(WhatToRead what_to_read, const char* timer_message);
+ void ResetAndEvictSystemDiskCache();
+
+ // Complete perf tests.
+ void CacheBackendPerformance();
+
+ const int kNumEntries = 1000;
+ const int kHeadersSize = 200;
+ const int kBodySize = 16 * 1024 - 1;
+
+ std::vector<TestEntry> entries_;
+};
// Creates num_entries on the cache, and writes 200 bytes of metadata and up
-// to kMaxSize of data to each entry.
-bool TimeWrite(int num_entries,
- disk_cache::Backend* cache,
- TestEntries* entries) {
- const int kSize1 = 200;
- scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize1));
- scoped_refptr<net::IOBuffer> buffer2(new net::IOBuffer(kMaxSize));
+// to kBodySize of data to each entry.
+bool DiskCachePerfTest::TimeWrite() {
+ scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kHeadersSize));
+ scoped_refptr<net::IOBuffer> buffer2(new net::IOBuffer(kBodySize));
- CacheTestFillBuffer(buffer1->data(), kSize1, false);
- CacheTestFillBuffer(buffer2->data(), kMaxSize, false);
+ CacheTestFillBuffer(buffer1->data(), kHeadersSize, false);
+ CacheTestFillBuffer(buffer2->data(), kBodySize, false);
int expected = 0;
@@ -61,23 +72,23 @@ bool TimeWrite(int num_entries,
base::PerfTimeLogger timer("Write disk cache entries");
- for (int i = 0; i < num_entries; i++) {
+ for (int i = 0; i < kNumEntries; i++) {
TestEntry entry;
entry.key = GenerateKey(true);
- entry.data_len = rand() % kMaxSize;
- entries->push_back(entry);
+ entry.data_len = rand() % kBodySize;
+ entries_.push_back(entry);
disk_cache::Entry* cache_entry;
net::TestCompletionCallback cb;
- int rv = cache->CreateEntry(entry.key, &cache_entry, cb.callback());
+ int rv = cache_->CreateEntry(entry.key, &cache_entry, cb.callback());
if (net::OK != cb.GetResult(rv))
break;
int ret = cache_entry->WriteData(
- 0, 0, buffer1.get(), kSize1,
+ 0, 0, buffer1.get(), kHeadersSize,
base::Bind(&CallbackTest::Run, base::Unretained(&callback)), false);
if (net::ERR_IO_PENDING == ret)
expected++;
- else if (kSize1 != ret)
+ else if (kHeadersSize != ret)
break;
ret = cache_entry->WriteData(
@@ -93,51 +104,49 @@ bool TimeWrite(int num_entries,
helper.WaitUntilCacheIoFinished(expected);
timer.Done();
- return (expected == helper.callbacks_called());
+ return expected == helper.callbacks_called();
}
// Reads the data and metadata from each entry listed on |entries|.
-bool TimeRead(int num_entries,
- disk_cache::Backend* cache,
- const TestEntries& entries,
- bool cold) {
- const int kSize1 = 200;
- scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize1));
- scoped_refptr<net::IOBuffer> buffer2(new net::IOBuffer(kMaxSize));
+bool DiskCachePerfTest::TimeRead(WhatToRead what_to_read,
+ const char* timer_message) {
+ scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kHeadersSize));
+ scoped_refptr<net::IOBuffer> buffer2(new net::IOBuffer(kBodySize));
- CacheTestFillBuffer(buffer1->data(), kSize1, false);
- CacheTestFillBuffer(buffer2->data(), kMaxSize, false);
+ CacheTestFillBuffer(buffer1->data(), kHeadersSize, false);
+ CacheTestFillBuffer(buffer2->data(), kBodySize, false);
int expected = 0;
MessageLoopHelper helper;
CallbackTest callback(&helper, true);
- const char* message = cold ? "Read disk cache entries (cold)"
- : "Read disk cache entries (warm)";
- base::PerfTimeLogger timer(message);
+ base::PerfTimeLogger timer(timer_message);
- for (int i = 0; i < num_entries; i++) {
+ for (int i = 0; i < kNumEntries; i++) {
disk_cache::Entry* cache_entry;
net::TestCompletionCallback cb;
- int rv = cache->OpenEntry(entries[i].key, &cache_entry, cb.callback());
+ int rv = cache_->OpenEntry(entries_[i].key, &cache_entry, cb.callback());
if (net::OK != cb.GetResult(rv))
break;
int ret = cache_entry->ReadData(
- 0, 0, buffer1.get(), kSize1,
+ 0, 0, buffer1.get(), kHeadersSize,
base::Bind(&CallbackTest::Run, base::Unretained(&callback)));
if (net::ERR_IO_PENDING == ret)
expected++;
- else if (kSize1 != ret)
+ else if (kHeadersSize != ret)
break;
- ret = cache_entry->ReadData(
- 1, 0, buffer2.get(), entries[i].data_len,
- base::Bind(&CallbackTest::Run, base::Unretained(&callback)));
- if (net::ERR_IO_PENDING == ret)
- expected++;
- else if (entries[i].data_len != ret)
- break;
+ if (what_to_read == WhatToRead::HEADERS_AND_BODY) {
+ ret = cache_entry->ReadData(
+ 1, 0, buffer2.get(), entries_[i].data_len,
+ base::Bind(&CallbackTest::Run, base::Unretained(&callback)));
+ if (net::ERR_IO_PENDING == ret)
+ expected++;
+ else if (entries_[i].data_len != ret)
+ break;
+ }
+
cache_entry->Close();
}
@@ -147,11 +156,6 @@ bool TimeRead(int num_entries,
return (expected == helper.callbacks_called());
}
-int BlockSize() {
- // We can use form 1 to 4 blocks.
- return (rand() & 0x3) + 1;
-}
-
TEST_F(DiskCachePerfTest, BlockfileHashes) {
int seed = static_cast<int>(Time::Now().ToInternalValue());
srand(seed);
@@ -164,21 +168,7 @@ TEST_F(DiskCachePerfTest, BlockfileHashes) {
timer.Done();
}
-void DiskCachePerfTest::CacheBackendPerformance() {
- base::Thread cache_thread("CacheThread");
- ASSERT_TRUE(cache_thread.StartWithOptions(
- base::Thread::Options(base::MessageLoop::TYPE_IO, 0)));
-
- int seed = static_cast<int>(Time::Now().ToInternalValue());
- srand(seed);
-
- InitCache();
-
- TestEntries entries;
- int num_entries = 1000;
-
- EXPECT_TRUE(TimeWrite(num_entries, cache_.get(), &entries));
-
+void DiskCachePerfTest::ResetAndEvictSystemDiskCache() {
base::MessageLoop::current()->RunUntilIdle();
cache_.reset();
@@ -199,9 +189,24 @@ void DiskCachePerfTest::CacheBackendPerformance() {
DisableFirstCleanup();
InitCache();
+}
- EXPECT_TRUE(TimeRead(num_entries, cache_.get(), entries, true));
- EXPECT_TRUE(TimeRead(num_entries, cache_.get(), entries, false));
+void DiskCachePerfTest::CacheBackendPerformance() {
+ InitCache();
+ EXPECT_TRUE(TimeWrite());
+
+ ResetAndEvictSystemDiskCache();
+ EXPECT_TRUE(TimeRead(WhatToRead::HEADERS_ONLY,
+ "Read disk cache headers only (cold)"));
+ EXPECT_TRUE(TimeRead(WhatToRead::HEADERS_ONLY,
+ "Read disk cache headers only (warm)"));
+ base::MessageLoop::current()->RunUntilIdle();
+
+ ResetAndEvictSystemDiskCache();
+ EXPECT_TRUE(
+ TimeRead(WhatToRead::HEADERS_AND_BODY, "Read disk cache entries (cold)"));
+ EXPECT_TRUE(
+ TimeRead(WhatToRead::HEADERS_AND_BODY, "Read disk cache entries (warm)"));
base::MessageLoop::current()->RunUntilIdle();
}
@@ -214,6 +219,11 @@ TEST_F(DiskCachePerfTest, SimpleCacheBackendPerformance) {
CacheBackendPerformance();
}
+int BlockSize() {
+ // We can use form 1 to 4 blocks.
+ return (rand() & 0x3) + 1;
+}
+
// Creating and deleting "entries" on a block-file is something quite frequent
// (after all, almost everything is stored on block files). The operation is
// almost free when the file is empty, but can be expensive if the file gets
@@ -228,13 +238,13 @@ TEST_F(DiskCachePerfTest, BlockFilesPerformance) {
int seed = static_cast<int>(Time::Now().ToInternalValue());
srand(seed);
- const int kNumEntries = 60000;
- disk_cache::Addr* address = new disk_cache::Addr[kNumEntries];
+ const int kNumBlocks = 60000;
+ disk_cache::Addr address[kNumBlocks];
base::PerfTimeLogger timer1("Fill three block-files");
// Fill up the 32-byte block file (use three files).
- for (int i = 0; i < kNumEntries; i++) {
+ for (int i = 0; i < kNumBlocks; i++) {
EXPECT_TRUE(
files.CreateBlock(disk_cache::RANKINGS, BlockSize(), &address[i]));
}
@@ -243,8 +253,8 @@ TEST_F(DiskCachePerfTest, BlockFilesPerformance) {
base::PerfTimeLogger timer2("Create and delete blocks");
for (int i = 0; i < 200000; i++) {
- int entry = rand() * (kNumEntries / RAND_MAX + 1);
- if (entry >= kNumEntries)
+ int entry = rand() * (kNumBlocks / RAND_MAX + 1);
+ if (entry >= kNumBlocks)
entry = 0;
files.DeleteBlock(address[entry], false);
@@ -254,7 +264,6 @@ TEST_F(DiskCachePerfTest, BlockFilesPerformance) {
timer2.Done();
base::MessageLoop::current()->RunUntilIdle();
- delete[] address;
}
} // namespace
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698