Index: chrome/browser/visitedlink_perftest.cc |
=================================================================== |
--- chrome/browser/visitedlink_perftest.cc (revision 68044) |
+++ chrome/browser/visitedlink_perftest.cc (working copy) |
@@ -1,207 +0,0 @@ |
-// Copyright (c) 2006-2008 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 <algorithm> |
-#include <string> |
-#include <vector> |
- |
-#include "base/file_path.h" |
-#include "base/file_util.h" |
-#include "base/perftimer.h" |
-#include "base/shared_memory.h" |
-#include "base/string_util.h" |
-#include "base/test/test_file_util.h" |
-#include "chrome/browser/visitedlink_master.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
- |
-using base::TimeDelta; |
- |
-namespace { |
- |
-// how we generate URLs, note that the two strings should be the same length |
-const int add_count = 10000; |
-const int load_test_add_count = 250000; |
-const char added_prefix[] = "http://www.google.com/stuff/something/foo?session=85025602345625&id=1345142319023&seq="; |
-const char unadded_prefix[] = "http://www.google.org/stuff/something/foo?session=39586739476365&id=2347624314402&seq="; |
- |
-// Returns a URL with the given prefix and index |
-GURL TestURL(const char* prefix, int i) { |
- return GURL(StringPrintf("%s%d", prefix, i)); |
-} |
- |
-// We have no slaves, so all methods on this listener are a no-ops. |
-class DummyVisitedLinkEventListener : public VisitedLinkMaster::Listener { |
- public: |
- DummyVisitedLinkEventListener() {} |
- virtual void NewTable(base::SharedMemory* table) {} |
- virtual void Add(VisitedLinkCommon::Fingerprint) {} |
- virtual void Reset() {} |
- |
- static DummyVisitedLinkEventListener* GetInstance() { |
- static DummyVisitedLinkEventListener instance; |
- return &instance; |
- } |
-}; |
- |
- |
-// Call at the beginning of the test to retrieve the database name. |
-void InitDBName(std::wstring* db_name) { |
- FilePath db_path; |
- ASSERT_TRUE(file_util::GetCurrentDirectory(&db_path)); |
- db_path = db_path.AppendASCII("TempVisitedLinks"); |
- *db_name = db_path.ToWStringHack(); |
-} |
- |
-// this checks IsVisited for the URLs starting with the given prefix and |
-// within the given range |
-void CheckVisited(VisitedLinkMaster& master, const char* prefix, |
- int begin, int end) { |
- for (int i = begin; i < end; i++) |
- master.IsVisited(TestURL(prefix, i)); |
-} |
- |
-// Fills that master's table with URLs starting with the given prefix and |
-// within the given range |
-void FillTable(VisitedLinkMaster& master, const char* prefix, |
- int begin, int end) { |
- for (int i = begin; i < end; i++) |
- master.AddURL(TestURL(prefix, i)); |
-} |
- |
-class VisitedLink : public testing::Test { |
- protected: |
- std::wstring db_name_; |
- virtual void SetUp() { |
- InitDBName(&db_name_); |
- file_util::Delete(db_name_, false); |
- } |
- virtual void TearDown() { |
- file_util::Delete(db_name_, false); |
- } |
-}; |
- |
-} // namespace |
- |
-// This test tests adding many things to a database, and how long it takes |
-// to query the database with different numbers of things in it. The time |
-// is the total time to do all the operations, and as such, it is only |
-// useful for a regression test. If there is a regression, it might be |
-// useful to make another set of tests to test these things in isolation. |
-TEST_F(VisitedLink, TestAddAndQuery) { |
- // init |
- VisitedLinkMaster master(DummyVisitedLinkEventListener::GetInstance(), |
- NULL, true, FilePath(db_name_), 0); |
- ASSERT_TRUE(master.Init()); |
- |
- PerfTimeLogger timer("Visited_link_add_and_query"); |
- |
- // first check without anything in the table |
- CheckVisited(master, added_prefix, 0, add_count); |
- |
- // now fill half the table |
- const int half_size = add_count / 2; |
- FillTable(master, added_prefix, 0, half_size); |
- |
- // check the table again, half of these URLs will be visited, the other half |
- // will not |
- CheckVisited(master, added_prefix, 0, add_count); |
- |
- // fill the rest of the table |
- FillTable(master, added_prefix, half_size, add_count); |
- |
- // check URLs, doing half visited, half unvisited |
- CheckVisited(master, added_prefix, 0, add_count); |
- CheckVisited(master, unadded_prefix, 0, add_count); |
-} |
- |
-// Tests how long it takes to write and read a large database to and from disk. |
-TEST_F(VisitedLink, TestLoad) { |
- // create a big DB |
- { |
- PerfTimeLogger table_initialization_timer("Table_initialization"); |
- |
- VisitedLinkMaster master(DummyVisitedLinkEventListener::GetInstance(), |
- NULL, true, FilePath(db_name_), 0); |
- |
- // time init with empty table |
- PerfTimeLogger initTimer("Empty_visited_link_init"); |
- bool success = master.Init(); |
- initTimer.Done(); |
- ASSERT_TRUE(success); |
- |
- // add a bunch of stuff |
- // TODO(maruel): This is very inefficient because the file gets rewritten |
- // many time and this is the actual bottleneck of this test. The file should |
- // only get written that the end of the FillTable call, not 4169(!) times. |
- FillTable(master, added_prefix, 0, load_test_add_count); |
- |
- // time writing the file out out |
- PerfTimeLogger flushTimer("Visited_link_database_flush"); |
- master.RewriteFile(); |
- // TODO(maruel): Without calling FlushFileBuffers(master.file_); you don't |
- // know really how much time it took to write the file. |
- flushTimer.Done(); |
- |
- table_initialization_timer.Done(); |
- } |
- |
- // test loading the DB back, we do this several times since the flushing is |
- // not very reliable. |
- const int load_count = 5; |
- std::vector<double> cold_load_times; |
- std::vector<double> hot_load_times; |
- for (int i = 0; i < load_count; i++) { |
- // make sure the file has to be re-loaded |
- file_util::EvictFileFromSystemCache( |
- FilePath::FromWStringHack(std::wstring(db_name_))); |
- |
- // cold load (no OS cache, hopefully) |
- { |
- PerfTimer cold_timer; |
- |
- VisitedLinkMaster master(DummyVisitedLinkEventListener::GetInstance(), |
- NULL, |
- true, |
- FilePath(db_name_), |
- 0); |
- bool success = master.Init(); |
- TimeDelta elapsed = cold_timer.Elapsed(); |
- ASSERT_TRUE(success); |
- |
- cold_load_times.push_back(elapsed.InMillisecondsF()); |
- } |
- |
- // hot load (with OS caching the file in memory) |
- { |
- PerfTimer hot_timer; |
- |
- VisitedLinkMaster master(DummyVisitedLinkEventListener::GetInstance(), |
- NULL, |
- true, |
- FilePath(db_name_), |
- 0); |
- bool success = master.Init(); |
- TimeDelta elapsed = hot_timer.Elapsed(); |
- ASSERT_TRUE(success); |
- |
- hot_load_times.push_back(elapsed.InMillisecondsF()); |
- } |
- } |
- |
- // We discard the max and return the average time. |
- cold_load_times.erase(std::max_element(cold_load_times.begin(), |
- cold_load_times.end())); |
- hot_load_times.erase(std::max_element(hot_load_times.begin(), |
- hot_load_times.end())); |
- |
- double cold_sum = 0, hot_sum = 0; |
- for (int i = 0; i < static_cast<int>(cold_load_times.size()); i++) { |
- cold_sum += cold_load_times[i]; |
- hot_sum += hot_load_times[i]; |
- } |
- LogPerfResult("Visited_link_cold_load_time", |
- cold_sum / cold_load_times.size(), "ms"); |
- LogPerfResult("Visited_link_hot_load_time", |
- hot_sum / hot_load_times.size(), "ms"); |
-} |