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 |