summaryrefslogtreecommitdiffstats
path: root/layout/style/test/gtest/StyloParsingBench.cpp
blob: 4c14ebed7c13f783364342499e14388ba0e7d3ca (plain)
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
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#include "gtest/gtest.h"
#include "gtest/MozGTestBench.h"
#include "nsString.h"
#include "ExampleStylesheet.h"
#include "ServoBindings.h"
#include "mozilla/dom/DOMString.h"
#include "mozilla/Encoding.h"
#include "mozilla/Utf8.h"
#include "mozilla/NullPrincipal.h"
#include "mozilla/css/SheetParsingMode.h"
#include "ReferrerInfo.h"
#include "nsCSSValue.h"
#include "ReferrerInfo.h"

using namespace mozilla;
using namespace mozilla::css;
using namespace mozilla::dom;
using namespace mozilla::net;

// Bug 1436018 - Disable Stylo microbenchmark on Windows
#if !defined(_WIN32) && !defined(_WIN64)

#  define PARSING_REPETITIONS 20
#  define SETPROPERTY_REPETITIONS (1000 * 1000)
#  define GETPROPERTY_REPETITIONS (1000 * 1000)

static void ServoParsingBench(const StyleUseCounters* aCounters) {
  auto css = AsBytes(MakeStringSpan(EXAMPLE_STYLESHEET));
  nsCString cssStr;
  cssStr.Append(css);
  ASSERT_EQ(Encoding::UTF8ValidUpTo(css), css.Length());

  RefPtr<nsIURI> uri = NullPrincipal::CreateURI();
  nsCOMPtr<nsIReferrerInfo> referrerInfo = new ReferrerInfo(nullptr);
  RefPtr<URLExtraData> data =
      new URLExtraData(uri.forget(), referrerInfo.forget(),
                       NullPrincipal::CreateWithoutOriginAttributes());
  for (int i = 0; i < PARSING_REPETITIONS; i++) {
    RefPtr<StyleStylesheetContents> stylesheet =
        Servo_StyleSheet_FromUTF8Bytes(
            nullptr, nullptr, nullptr, &cssStr, eAuthorSheetFeatures, data,
            eCompatibility_FullStandards, nullptr, aCounters,
            StyleAllowImportRules::Yes, StyleSanitizationKind::None, nullptr)
            .Consume();
  }
}

static constexpr auto STYLE_RULE = StyleCssRuleType::Style;

static void ServoSetPropertyByIdBench(const nsACString& css) {
  RefPtr<StyleLockedDeclarationBlock> block =
      Servo_DeclarationBlock_CreateEmpty().Consume();
  RefPtr<nsIURI> uri = NullPrincipal::CreateURI();
  nsCOMPtr<nsIReferrerInfo> referrerInfo = new ReferrerInfo(nullptr);
  RefPtr<URLExtraData> data =
      new URLExtraData(uri.forget(), referrerInfo.forget(),
                       NullPrincipal::CreateWithoutOriginAttributes());
  ASSERT_TRUE(IsUtf8(css));

  for (int i = 0; i < SETPROPERTY_REPETITIONS; i++) {
    Servo_DeclarationBlock_SetPropertyById(
        block, eCSSProperty_width, &css,
        /* is_important = */ false, data, StyleParsingMode::DEFAULT,
        eCompatibility_FullStandards, nullptr, STYLE_RULE, {});
  }
}

static void ServoGetPropertyValueById() {
  RefPtr<StyleLockedDeclarationBlock> block =
      Servo_DeclarationBlock_CreateEmpty().Consume();

  RefPtr<nsIURI> uri = NullPrincipal::CreateURI();
  nsCOMPtr<nsIReferrerInfo> referrerInfo = new ReferrerInfo(nullptr);
  RefPtr<URLExtraData> data =
      new URLExtraData(uri.forget(), referrerInfo.forget(),
                       NullPrincipal::CreateWithoutOriginAttributes());
  constexpr auto css_ = "10px"_ns;
  const nsACString& css = css_;
  Servo_DeclarationBlock_SetPropertyById(
      block, eCSSProperty_width, &css,
      /* is_important = */ false, data, StyleParsingMode::DEFAULT,
      eCompatibility_FullStandards, nullptr, STYLE_RULE, {});

  for (int i = 0; i < GETPROPERTY_REPETITIONS; i++) {
    nsAutoCString value;
    Servo_DeclarationBlock_GetPropertyValueById(block, eCSSProperty_width,
                                                &value);
    ASSERT_TRUE(value.EqualsLiteral("10px"));
  }
}

MOZ_GTEST_BENCH(Stylo, Servo_StyleSheet_FromUTF8Bytes_Bench,
                [] { ServoParsingBench(nullptr); });

MOZ_GTEST_BENCH(Stylo, Servo_StyleSheet_FromUTF8Bytes_Bench_UseCounters, [] {
  UniquePtr<StyleUseCounters> counters(Servo_UseCounters_Create());
  ServoParsingBench(counters.get());
});

MOZ_GTEST_BENCH(Stylo, Servo_DeclarationBlock_SetPropertyById_Bench,
                [] { ServoSetPropertyByIdBench("10px"_ns); });

MOZ_GTEST_BENCH(Stylo,
                Servo_DeclarationBlock_SetPropertyById_WithInitialSpace_Bench,
                [] { ServoSetPropertyByIdBench(" 10px"_ns); });

MOZ_GTEST_BENCH(Stylo, Servo_DeclarationBlock_GetPropertyById_Bench,
                ServoGetPropertyValueById);

#endif