diff options
Diffstat (limited to 'chromium/net/disk_cache/disk_cache_perftest.cc')
-rw-r--r-- | chromium/net/disk_cache/disk_cache_perftest.cc | 250 |
1 files changed, 0 insertions, 250 deletions
diff --git a/chromium/net/disk_cache/disk_cache_perftest.cc b/chromium/net/disk_cache/disk_cache_perftest.cc deleted file mode 100644 index 6adc4bca709..00000000000 --- a/chromium/net/disk_cache/disk_cache_perftest.cc +++ /dev/null @@ -1,250 +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 "base/timer/timer.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/backend_impl.h" -#include "net/disk_cache/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.message_loop_proxy().get(), 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(file_util::EvictFileFromSystemCache( - cache_path_.AppendASCII("index"))); - ASSERT_TRUE(file_util::EvictFileFromSystemCache( - cache_path_.AppendASCII("data_0"))); - ASSERT_TRUE(file_util::EvictFileFromSystemCache( - cache_path_.AppendASCII("data_1"))); - ASSERT_TRUE(file_util::EvictFileFromSystemCache( - cache_path_.AppendASCII("data_2"))); - ASSERT_TRUE(file_util::EvictFileFromSystemCache( - cache_path_.AppendASCII("data_3"))); - - rv = disk_cache::CreateCacheBackend( - net::DISK_CACHE, net::CACHE_BACKEND_BLOCKFILE, cache_path_, 0, false, - cache_thread.message_loop_proxy().get(), 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; -} |