Index: net/disk_cache/blockfile/disk_cache_perftest.cc |
diff --git a/net/disk_cache/blockfile/disk_cache_perftest.cc b/net/disk_cache/blockfile/disk_cache_perftest.cc |
deleted file mode 100644 |
index 9aaa7f407b1aa62c049419154302adbcf6adf38a..0000000000000000000000000000000000000000 |
--- a/net/disk_cache/blockfile/disk_cache_perftest.cc |
+++ /dev/null |
@@ -1,261 +0,0 @@ |
-// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include <string> |
- |
-#include "base/basictypes.h" |
-#include "base/bind.h" |
-#include "base/bind_helpers.h" |
-#include "base/hash.h" |
-#include "base/strings/string_util.h" |
-#include "base/test/perf_time_logger.h" |
-#include "base/test/test_file_util.h" |
-#include "base/threading/thread.h" |
-#include "net/base/cache_type.h" |
-#include "net/base/io_buffer.h" |
-#include "net/base/net_errors.h" |
-#include "net/base/test_completion_callback.h" |
-#include "net/disk_cache/blockfile/backend_impl.h" |
-#include "net/disk_cache/blockfile/block_files.h" |
-#include "net/disk_cache/disk_cache.h" |
-#include "net/disk_cache/disk_cache_test_base.h" |
-#include "net/disk_cache/disk_cache_test_util.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
-#include "testing/platform_test.h" |
- |
-using base::Time; |
- |
-namespace { |
- |
-struct TestEntry { |
- std::string key; |
- int data_len; |
-}; |
-typedef std::vector<TestEntry> TestEntries; |
- |
-const int kMaxSize = 16 * 1024 - 1; |
- |
-// 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)); |
- |
- CacheTestFillBuffer(buffer1->data(), kSize1, false); |
- CacheTestFillBuffer(buffer2->data(), kMaxSize, false); |
- |
- int expected = 0; |
- |
- MessageLoopHelper helper; |
- CallbackTest callback(&helper, true); |
- |
- base::PerfTimeLogger timer("Write disk cache entries"); |
- |
- for (int i = 0; i < num_entries; i++) { |
- TestEntry entry; |
- entry.key = GenerateKey(true); |
- entry.data_len = rand() % kMaxSize; |
- entries->push_back(entry); |
- |
- disk_cache::Entry* cache_entry; |
- net::TestCompletionCallback cb; |
- 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, |
- base::Bind(&CallbackTest::Run, base::Unretained(&callback)), false); |
- if (net::ERR_IO_PENDING == ret) |
- expected++; |
- else if (kSize1 != ret) |
- break; |
- |
- ret = cache_entry->WriteData( |
- 1, 0, buffer2.get(), entry.data_len, |
- base::Bind(&CallbackTest::Run, base::Unretained(&callback)), false); |
- if (net::ERR_IO_PENDING == ret) |
- expected++; |
- else if (entry.data_len != ret) |
- break; |
- cache_entry->Close(); |
- } |
- |
- helper.WaitUntilCacheIoFinished(expected); |
- timer.Done(); |
- |
- 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)); |
- |
- CacheTestFillBuffer(buffer1->data(), kSize1, false); |
- CacheTestFillBuffer(buffer2->data(), kMaxSize, 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); |
- |
- for (int i = 0; i < num_entries; i++) { |
- disk_cache::Entry* cache_entry; |
- net::TestCompletionCallback cb; |
- 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, |
- base::Bind(&CallbackTest::Run, base::Unretained(&callback))); |
- if (net::ERR_IO_PENDING == ret) |
- expected++; |
- else if (kSize1 != 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; |
- cache_entry->Close(); |
- } |
- |
- helper.WaitUntilCacheIoFinished(expected); |
- timer.Done(); |
- |
- return (expected == helper.callbacks_called()); |
-} |
- |
-int BlockSize() { |
- // We can use form 1 to 4 blocks. |
- return (rand() & 0x3) + 1; |
-} |
- |
-} // namespace |
- |
-TEST_F(DiskCacheTest, Hash) { |
- int seed = static_cast<int>(Time::Now().ToInternalValue()); |
- srand(seed); |
- |
- base::PerfTimeLogger timer("Hash disk cache keys"); |
- for (int i = 0; i < 300000; i++) { |
- std::string key = GenerateKey(true); |
- base::Hash(key); |
- } |
- timer.Done(); |
-} |
- |
-TEST_F(DiskCacheTest, CacheBackendPerformance) { |
- base::Thread cache_thread("CacheThread"); |
- ASSERT_TRUE(cache_thread.StartWithOptions( |
- base::Thread::Options(base::MessageLoop::TYPE_IO, 0))); |
- |
- ASSERT_TRUE(CleanupCacheDir()); |
- net::TestCompletionCallback cb; |
- scoped_ptr<disk_cache::Backend> cache; |
- int rv = disk_cache::CreateCacheBackend(net::DISK_CACHE, |
- net::CACHE_BACKEND_BLOCKFILE, |
- cache_path_, |
- 0, |
- false, |
- cache_thread.task_runner(), |
- NULL, |
- &cache, |
- cb.callback()); |
- |
- ASSERT_EQ(net::OK, cb.GetResult(rv)); |
- |
- int seed = static_cast<int>(Time::Now().ToInternalValue()); |
- srand(seed); |
- |
- TestEntries entries; |
- int num_entries = 1000; |
- |
- EXPECT_TRUE(TimeWrite(num_entries, cache.get(), &entries)); |
- |
- base::MessageLoop::current()->RunUntilIdle(); |
- cache.reset(); |
- |
- ASSERT_TRUE(base::EvictFileFromSystemCache( |
- cache_path_.AppendASCII("index"))); |
- ASSERT_TRUE(base::EvictFileFromSystemCache( |
- cache_path_.AppendASCII("data_0"))); |
- ASSERT_TRUE(base::EvictFileFromSystemCache( |
- cache_path_.AppendASCII("data_1"))); |
- ASSERT_TRUE(base::EvictFileFromSystemCache( |
- cache_path_.AppendASCII("data_2"))); |
- ASSERT_TRUE(base::EvictFileFromSystemCache( |
- cache_path_.AppendASCII("data_3"))); |
- |
- rv = disk_cache::CreateCacheBackend(net::DISK_CACHE, |
- net::CACHE_BACKEND_BLOCKFILE, |
- cache_path_, |
- 0, |
- false, |
- cache_thread.task_runner(), |
- NULL, |
- &cache, |
- cb.callback()); |
- ASSERT_EQ(net::OK, cb.GetResult(rv)); |
- |
- EXPECT_TRUE(TimeRead(num_entries, cache.get(), entries, true)); |
- |
- EXPECT_TRUE(TimeRead(num_entries, cache.get(), entries, false)); |
- |
- base::MessageLoop::current()->RunUntilIdle(); |
-} |
- |
-// 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 |
-// fragmented, or if we have multiple files. This test measures that scenario, |
-// by using multiple, highly fragmented files. |
-TEST_F(DiskCacheTest, BlockFilesPerformance) { |
- ASSERT_TRUE(CleanupCacheDir()); |
- |
- disk_cache::BlockFiles files(cache_path_); |
- ASSERT_TRUE(files.Init(true)); |
- |
- int seed = static_cast<int>(Time::Now().ToInternalValue()); |
- srand(seed); |
- |
- const int kNumEntries = 60000; |
- disk_cache::Addr* address = new disk_cache::Addr[kNumEntries]; |
- |
- base::PerfTimeLogger timer1("Fill three block-files"); |
- |
- // Fill up the 32-byte block file (use three files). |
- for (int i = 0; i < kNumEntries; i++) { |
- EXPECT_TRUE(files.CreateBlock(disk_cache::RANKINGS, BlockSize(), |
- &address[i])); |
- } |
- |
- timer1.Done(); |
- base::PerfTimeLogger timer2("Create and delete blocks"); |
- |
- for (int i = 0; i < 200000; i++) { |
- int entry = rand() * (kNumEntries / RAND_MAX + 1); |
- if (entry >= kNumEntries) |
- entry = 0; |
- |
- files.DeleteBlock(address[entry], false); |
- EXPECT_TRUE(files.CreateBlock(disk_cache::RANKINGS, BlockSize(), |
- &address[entry])); |
- } |
- |
- timer2.Done(); |
- base::MessageLoop::current()->RunUntilIdle(); |
- delete[] address; |
-} |