| Index: net/base/mime_sniffer_perftest.cc
|
| diff --git a/net/base/mime_sniffer_perftest.cc b/net/base/mime_sniffer_perftest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..eaced27b6610f6322a80056c9ce60a8b981cad32
|
| --- /dev/null
|
| +++ b/net/base/mime_sniffer_perftest.cc
|
| @@ -0,0 +1,107 @@
|
| +// Copyright 2015 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 "net/base/mime_sniffer.h"
|
| +
|
| +#include <vector>
|
| +
|
| +#include "base/bits.h"
|
| +#include "base/logging.h"
|
| +#include "base/timer/elapsed_timer.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +namespace net {
|
| +namespace {
|
| +
|
| +// This text is supposed to be representative of a plain text file the browser
|
| +// might encounter, including a variation in line lengths and blank
|
| +// lines. CRLF is used as the line-terminator to make it slightly more
|
| +// difficult. It is roughly 1KB.
|
| +const char kRepresentativePlainText[] =
|
| + "The Tragedie of Hamlet\r\n"
|
| + "\r\n"
|
| + "Actus Primus. Scoena Prima.\r\n"
|
| + "\r\n"
|
| + "Enter Barnardo and Francisco two Centinels.\r\n"
|
| + "\r\n"
|
| + " Barnardo. Who's there?\r\n"
|
| + " Fran. Nay answer me: Stand & vnfold\r\n"
|
| + "your selfe\r\n"
|
| + "\r\n"
|
| + " Bar. Long liue the King\r\n"
|
| + "\r\n"
|
| + " Fran. Barnardo?\r\n"
|
| + " Bar. He\r\n"
|
| + "\r\n"
|
| + " Fran. You come most carefully vpon your houre\r\n"
|
| + "\r\n"
|
| + " Bar. 'Tis now strook twelue, get thee to bed Francisco\r\n"
|
| + "\r\n"
|
| + " Fran. For this releefe much thankes: 'Tis bitter cold,\r\n"
|
| + "And I am sicke at heart\r\n"
|
| + "\r\n"
|
| + " Barn. Haue you had quiet Guard?\r\n"
|
| + " Fran. Not a Mouse stirring\r\n"
|
| + "\r\n"
|
| + " Barn. Well, goodnight. If you do meet Horatio and\r\n"
|
| + "Marcellus, the Riuals of my Watch, bid them make hast.\r\n"
|
| + "Enter Horatio and Marcellus.\r\n"
|
| + "\r\n"
|
| + " Fran. I thinke I heare them. Stand: who's there?\r\n"
|
| + " Hor. Friends to this ground\r\n"
|
| + "\r\n"
|
| + " Mar. And Leige-men to the Dane\r\n"
|
| + "\r\n"
|
| + " Fran. Giue you good night\r\n"
|
| + "\r\n"
|
| + " Mar. O farwel honest Soldier, who hath relieu'd you?\r\n"
|
| + " Fra. Barnardo ha's my place: giue you goodnight.\r\n"
|
| + "\r\n"
|
| + "Exit Fran.\r\n"
|
| + "\r\n"
|
| + " Mar. Holla Barnardo\r\n"
|
| + "\r\n"
|
| + " Bar. Say, what is Horatio there?\r\n"
|
| + " Hor. A peece of him\r\n"
|
| + "\r\n"
|
| + " Bar. Welcome Horatio, welcome good Marcellus\r\n"
|
| + "\r\n";
|
| +
|
| +void RunLooksLikeBinary(const std::string& plaintext, size_t iterations) {
|
| + bool looks_like_binary = false;
|
| + for (size_t i = 0; i < iterations; ++i) {
|
| + if (LooksLikeBinary(&plaintext[0], plaintext.size()))
|
| + looks_like_binary = true;
|
| + }
|
| + CHECK(!looks_like_binary);
|
| +}
|
| +
|
| +TEST(MimeSnifferTest, PlainTextPerfTest) {
|
| + // Android systems have a relatively small CPU cache (512KB to 2MB).
|
| + // It is better if the test data fits in cache so that we are not just
|
| + // testing bus bandwidth.
|
| + const size_t kTargetSize = 1 << 18; // 256KB
|
| + const size_t kWarmupIterations = 16;
|
| + const size_t kMeasuredIterations = 1 << 15;
|
| + std::string plaintext = kRepresentativePlainText;
|
| + // The purpose of the static_cast<size_t>() here is to prevent MSVC from
|
| + // complaining about an implicit promotion to 64 bits when compiling 64-bit.
|
| + size_t expected_size =
|
| + plaintext.size() *
|
| + static_cast<size_t>(
|
| + 1u << base::bits::Log2Ceiling(kTargetSize / plaintext.size()));
|
| + plaintext.reserve(expected_size);
|
| + while (plaintext.size() < kTargetSize)
|
| + plaintext += plaintext;
|
| + DCHECK_EQ(expected_size, plaintext.size());
|
| + RunLooksLikeBinary(plaintext, kWarmupIterations);
|
| + base::ElapsedTimer elapsed_timer;
|
| + RunLooksLikeBinary(plaintext, kMeasuredIterations);
|
| + LOG(INFO) << (elapsed_timer.Elapsed().InMicroseconds() * 1000 * 1024 /
|
| + (static_cast<int64>(plaintext.size()) * kMeasuredIterations))
|
| + << "ns per KB";
|
| +}
|
| +
|
| +} // namespace net
|
| +} // namespace
|
|
|