1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
   64
   65
   66
   67
   68
   69
   70
   71
   72
   73
   74
   75
   76
   77
   78
   79
   80
   81
   82
   83
   84
   85
   86
   87
   88
   89
   90
   91
   92
   93
   94
   95
   96
   97
   98
   99
  100
  101
  102
  103
  104
  105
  106
  107
  108
  109
  110
  111
  112
  113
  114
  115
  116
  117
  118
  119
  120
  121
  122

url / url_parse_perftest.cc [blame]

// Copyright 2006-2008 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include <string_view>

#include "base/test/perf_time_logger.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"
#include "url/third_party/mozilla/url_parse.h"
#include "url/url_canon.h"
#include "url/url_canon_stdstring.h"

namespace {

TEST(URLParse, FullURL) {
  constexpr std::string_view kUrl =
      "http://me:pass@host/foo/bar.html;param?query=yes#ref";

  url::Parsed parsed;
  base::PerfTimeLogger timer("Full_URL_Parse_AMillion");

  for (int i = 0; i < 1000000; i++)
    parsed = url::ParseStandardURL(kUrl);
  timer.Done();
}

constexpr std::string_view kTypicalUrl1 =
    "http://www.google.com/"
    "search?q=url+parsing&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-US:"
    "official&client=firefox-a";

constexpr std::string_view kTypicalUrl2 =
    "http://www.amazon.com/Stephen-King-Thrillers-Horror-People/dp/0766012336/"
    "ref=sr_1_2/133-4144931-4505264?ie=UTF8&s=books&qid=2144880915&sr=8-2";

constexpr std::string_view kTypicalUrl3 =
    "http://store.apple.com/1-800-MY-APPLE/WebObjects/AppleStore.woa/wa/"
    "RSLID?nnmm=browse&mco=578E9744&node=home/desktop/mac_pro";

TEST(URLParse, TypicalURLParse) {
  url::Parsed parsed1;
  url::Parsed parsed2;
  url::Parsed parsed3;

  // Do this 1/3 of a million times since we do 3 different URLs.
  base::PerfTimeLogger parse_timer("Typical_URL_Parse_AMillion");
  for (int i = 0; i < 333333; i++) {
    parsed1 = url::ParseStandardURL(kTypicalUrl1);
    parsed2 = url::ParseStandardURL(kTypicalUrl2);
    parsed3 = url::ParseStandardURL(kTypicalUrl3);
  }
  parse_timer.Done();
}

// Includes both parsing and canonicalization with no mallocs.
TEST(URLParse, TypicalURLParseCanon) {
  base::PerfTimeLogger canon_timer("Typical_Parse_Canon_AMillion");
  url::Parsed out_parsed;
  url::RawCanonOutput<1024> output;
  for (int i = 0; i < 333333; i++) {  // divide by 3 so we get 1M
    output.set_length(0);
    url::CanonicalizeStandardURL(
        kTypicalUrl1.data(), url::ParseStandardURL(kTypicalUrl1),
        url::SCHEME_WITH_HOST_PORT_AND_USER_INFORMATION, nullptr, &output,
        &out_parsed);

    output.set_length(0);
    url::CanonicalizeStandardURL(
        kTypicalUrl2.data(), url::ParseStandardURL(kTypicalUrl2),
        url::SCHEME_WITH_HOST_PORT_AND_USER_INFORMATION, nullptr, &output,
        &out_parsed);

    output.set_length(0);
    url::CanonicalizeStandardURL(
        kTypicalUrl3.data(), url::ParseStandardURL(kTypicalUrl3),
        url::SCHEME_WITH_HOST_PORT_AND_USER_INFORMATION, nullptr, &output,
        &out_parsed);
  }
  canon_timer.Done();
}

// Includes both parsing and canonicalization, and mallocs for the output.
TEST(URLParse, TypicalURLParseCanonStdString) {
  base::PerfTimeLogger canon_timer("Typical_Parse_Canon_AMillion");
  url::Parsed out_parsed;
  for (int i = 0; i < 333333; i++) {  // divide by 3 so we get 1M
    std::string out1;
    url::StdStringCanonOutput output1(&out1);
    url::CanonicalizeStandardURL(
        kTypicalUrl1.data(), url::ParseStandardURL(kTypicalUrl1),
        url::SCHEME_WITH_HOST_PORT_AND_USER_INFORMATION, nullptr, &output1,
        &out_parsed);

    std::string out2;
    url::StdStringCanonOutput output2(&out2);
    url::CanonicalizeStandardURL(
        kTypicalUrl2.data(), url::ParseStandardURL(kTypicalUrl2),
        url::SCHEME_WITH_HOST_PORT_AND_USER_INFORMATION, nullptr, &output2,
        &out_parsed);

    std::string out3;
    url::StdStringCanonOutput output3(&out3);
    url::CanonicalizeStandardURL(
        kTypicalUrl3.data(), url::ParseStandardURL(kTypicalUrl3),
        url::SCHEME_WITH_HOST_PORT_AND_USER_INFORMATION, nullptr, &output3,
        &out_parsed);
  }
  canon_timer.Done();
}

TEST(URLParse, GURL) {
  base::PerfTimeLogger gurl_timer("Typical_GURL_AMillion");
  for (int i = 0; i < 333333; i++) {  // divide by 3 so we get 1M
    GURL gurl1(kTypicalUrl1);
    GURL gurl2(kTypicalUrl2);
    GURL gurl3(kTypicalUrl3);
  }
  gurl_timer.Done();
}

}  // namespace