url_parse_perftest.cc 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "base/strings/string_piece.h"
  5. #include "base/test/perf_time_logger.h"
  6. #include "testing/gtest/include/gtest/gtest.h"
  7. #include "url/gurl.h"
  8. #include "url/third_party/mozilla/url_parse.h"
  9. #include "url/url_canon.h"
  10. #include "url/url_canon_stdstring.h"
  11. namespace {
  12. TEST(URLParse, FullURL) {
  13. constexpr base::StringPiece kUrl =
  14. "http://me:pass@host/foo/bar.html;param?query=yes#ref";
  15. url::Parsed parsed;
  16. base::PerfTimeLogger timer("Full_URL_Parse_AMillion");
  17. for (int i = 0; i < 1000000; i++)
  18. url::ParseStandardURL(kUrl.data(), kUrl.size(), &parsed);
  19. timer.Done();
  20. }
  21. constexpr base::StringPiece kTypicalUrl1 =
  22. "http://www.google.com/"
  23. "search?q=url+parsing&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-US:"
  24. "official&client=firefox-a";
  25. constexpr base::StringPiece kTypicalUrl2 =
  26. "http://www.amazon.com/Stephen-King-Thrillers-Horror-People/dp/0766012336/"
  27. "ref=sr_1_2/133-4144931-4505264?ie=UTF8&s=books&qid=2144880915&sr=8-2";
  28. constexpr base::StringPiece kTypicalUrl3 =
  29. "http://store.apple.com/1-800-MY-APPLE/WebObjects/AppleStore.woa/wa/"
  30. "RSLID?nnmm=browse&mco=578E9744&node=home/desktop/mac_pro";
  31. TEST(URLParse, TypicalURLParse) {
  32. url::Parsed parsed1;
  33. url::Parsed parsed2;
  34. url::Parsed parsed3;
  35. // Do this 1/3 of a million times since we do 3 different URLs.
  36. base::PerfTimeLogger parse_timer("Typical_URL_Parse_AMillion");
  37. for (int i = 0; i < 333333; i++) {
  38. url::ParseStandardURL(kTypicalUrl1.data(), kTypicalUrl1.size(), &parsed1);
  39. url::ParseStandardURL(kTypicalUrl2.data(), kTypicalUrl2.size(), &parsed2);
  40. url::ParseStandardURL(kTypicalUrl3.data(), kTypicalUrl3.size(), &parsed3);
  41. }
  42. parse_timer.Done();
  43. }
  44. // Includes both parsing and canonicalization with no mallocs.
  45. TEST(URLParse, TypicalURLParseCanon) {
  46. url::Parsed parsed1;
  47. url::Parsed parsed2;
  48. url::Parsed parsed3;
  49. base::PerfTimeLogger canon_timer("Typical_Parse_Canon_AMillion");
  50. url::Parsed out_parsed;
  51. url::RawCanonOutput<1024> output;
  52. for (int i = 0; i < 333333; i++) { // divide by 3 so we get 1M
  53. url::ParseStandardURL(kTypicalUrl1.data(), kTypicalUrl1.size(), &parsed1);
  54. output.set_length(0);
  55. url::CanonicalizeStandardURL(
  56. kTypicalUrl1.data(), kTypicalUrl1.size(), parsed1,
  57. url::SCHEME_WITH_HOST_PORT_AND_USER_INFORMATION, nullptr, &output,
  58. &out_parsed);
  59. url::ParseStandardURL(kTypicalUrl2.data(), kTypicalUrl2.size(), &parsed2);
  60. output.set_length(0);
  61. url::CanonicalizeStandardURL(
  62. kTypicalUrl2.data(), kTypicalUrl2.size(), parsed2,
  63. url::SCHEME_WITH_HOST_PORT_AND_USER_INFORMATION, nullptr, &output,
  64. &out_parsed);
  65. url::ParseStandardURL(kTypicalUrl3.data(), kTypicalUrl3.size(), &parsed3);
  66. output.set_length(0);
  67. url::CanonicalizeStandardURL(
  68. kTypicalUrl3.data(), kTypicalUrl3.size(), parsed3,
  69. url::SCHEME_WITH_HOST_PORT_AND_USER_INFORMATION, nullptr, &output,
  70. &out_parsed);
  71. }
  72. canon_timer.Done();
  73. }
  74. // Includes both parsing and canonicalization, and mallocs for the output.
  75. TEST(URLParse, TypicalURLParseCanonStdString) {
  76. url::Parsed parsed1;
  77. url::Parsed parsed2;
  78. url::Parsed parsed3;
  79. base::PerfTimeLogger canon_timer("Typical_Parse_Canon_AMillion");
  80. url::Parsed out_parsed;
  81. for (int i = 0; i < 333333; i++) { // divide by 3 so we get 1M
  82. url::ParseStandardURL(kTypicalUrl1.data(), kTypicalUrl1.size(), &parsed1);
  83. std::string out1;
  84. url::StdStringCanonOutput output1(&out1);
  85. url::CanonicalizeStandardURL(
  86. kTypicalUrl1.data(), kTypicalUrl1.size(), parsed1,
  87. url::SCHEME_WITH_HOST_PORT_AND_USER_INFORMATION, nullptr, &output1,
  88. &out_parsed);
  89. url::ParseStandardURL(kTypicalUrl2.data(), kTypicalUrl2.size(), &parsed2);
  90. std::string out2;
  91. url::StdStringCanonOutput output2(&out2);
  92. url::CanonicalizeStandardURL(
  93. kTypicalUrl2.data(), kTypicalUrl2.size(), parsed2,
  94. url::SCHEME_WITH_HOST_PORT_AND_USER_INFORMATION, nullptr, &output2,
  95. &out_parsed);
  96. url::ParseStandardURL(kTypicalUrl3.data(), kTypicalUrl3.size(), &parsed3);
  97. std::string out3;
  98. url::StdStringCanonOutput output3(&out3);
  99. url::CanonicalizeStandardURL(
  100. kTypicalUrl3.data(), kTypicalUrl3.size(), parsed3,
  101. url::SCHEME_WITH_HOST_PORT_AND_USER_INFORMATION, nullptr, &output3,
  102. &out_parsed);
  103. }
  104. canon_timer.Done();
  105. }
  106. TEST(URLParse, GURL) {
  107. base::PerfTimeLogger gurl_timer("Typical_GURL_AMillion");
  108. for (int i = 0; i < 333333; i++) { // divide by 3 so we get 1M
  109. GURL gurl1(kTypicalUrl1);
  110. GURL gurl2(kTypicalUrl2);
  111. GURL gurl3(kTypicalUrl3);
  112. }
  113. gurl_timer.Done();
  114. }
  115. } // namespace