1*8b6cd535SAndroid Build Coastguard Worker // Copyright (C) 2023 Google LLC
2*8b6cd535SAndroid Build Coastguard Worker //
3*8b6cd535SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*8b6cd535SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*8b6cd535SAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*8b6cd535SAndroid Build Coastguard Worker //
7*8b6cd535SAndroid Build Coastguard Worker // http://www.apache.org/licenses/LICENSE-2.0
8*8b6cd535SAndroid Build Coastguard Worker //
9*8b6cd535SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*8b6cd535SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*8b6cd535SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*8b6cd535SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*8b6cd535SAndroid Build Coastguard Worker // limitations under the License.
14*8b6cd535SAndroid Build Coastguard Worker
15*8b6cd535SAndroid Build Coastguard Worker #include "testing/base/public/benchmark.h"
16*8b6cd535SAndroid Build Coastguard Worker #include "gmock/gmock.h"
17*8b6cd535SAndroid Build Coastguard Worker #include "third_party/absl/flags/flag.h"
18*8b6cd535SAndroid Build Coastguard Worker #include "icing/document-builder.h"
19*8b6cd535SAndroid Build Coastguard Worker #include "icing/feature-flags.h"
20*8b6cd535SAndroid Build Coastguard Worker #include "icing/file/filesystem.h"
21*8b6cd535SAndroid Build Coastguard Worker #include "icing/proto/schema.pb.h"
22*8b6cd535SAndroid Build Coastguard Worker #include "icing/proto/search.pb.h"
23*8b6cd535SAndroid Build Coastguard Worker #include "icing/result/snippet-retriever.h"
24*8b6cd535SAndroid Build Coastguard Worker #include "icing/schema-builder.h"
25*8b6cd535SAndroid Build Coastguard Worker #include "icing/schema/schema-store.h"
26*8b6cd535SAndroid Build Coastguard Worker #include "icing/schema/section.h"
27*8b6cd535SAndroid Build Coastguard Worker #include "icing/testing/common-matchers.h"
28*8b6cd535SAndroid Build Coastguard Worker #include "icing/testing/random-string.h"
29*8b6cd535SAndroid Build Coastguard Worker #include "icing/testing/test-data.h"
30*8b6cd535SAndroid Build Coastguard Worker #include "icing/testing/test-feature-flags.h"
31*8b6cd535SAndroid Build Coastguard Worker #include "icing/testing/tmp-directory.h"
32*8b6cd535SAndroid Build Coastguard Worker #include "icing/tokenization/language-segmenter-factory.h"
33*8b6cd535SAndroid Build Coastguard Worker #include "icing/transform/normalizer-factory.h"
34*8b6cd535SAndroid Build Coastguard Worker #include "icing/util/clock.h"
35*8b6cd535SAndroid Build Coastguard Worker #include "icing/util/icu-data-file-helper.h"
36*8b6cd535SAndroid Build Coastguard Worker #include "icing/util/logging.h"
37*8b6cd535SAndroid Build Coastguard Worker #include "unicode/uloc.h"
38*8b6cd535SAndroid Build Coastguard Worker
39*8b6cd535SAndroid Build Coastguard Worker // Run on a Linux workstation:
40*8b6cd535SAndroid Build Coastguard Worker // $ blaze build -c opt --dynamic_mode=off --copt=-gmlt
41*8b6cd535SAndroid Build Coastguard Worker // //icing/result:snippet-retriever_benchmark
42*8b6cd535SAndroid Build Coastguard Worker //
43*8b6cd535SAndroid Build Coastguard Worker // $ blaze-bin/icing/result/snippet-retriever_benchmark
44*8b6cd535SAndroid Build Coastguard Worker // --benchmark_filter=all
45*8b6cd535SAndroid Build Coastguard Worker //
46*8b6cd535SAndroid Build Coastguard Worker // Run on an Android device:
47*8b6cd535SAndroid Build Coastguard Worker // Make target //icing/tokenization:language-segmenter depend on
48*8b6cd535SAndroid Build Coastguard Worker // //third_party/icu
49*8b6cd535SAndroid Build Coastguard Worker //
50*8b6cd535SAndroid Build Coastguard Worker // Make target //icing/transform:normalizer depend on
51*8b6cd535SAndroid Build Coastguard Worker // //third_party/icu
52*8b6cd535SAndroid Build Coastguard Worker //
53*8b6cd535SAndroid Build Coastguard Worker // $ blaze build --copt="-DGOOGLE_COMMANDLINEFLAGS_FULL_API=1"
54*8b6cd535SAndroid Build Coastguard Worker // --config=android_arm64 -c opt --dynamic_mode=off --copt=-gmlt
55*8b6cd535SAndroid Build Coastguard Worker // //icing/result:snippet-retriever_benchmark
56*8b6cd535SAndroid Build Coastguard Worker //
57*8b6cd535SAndroid Build Coastguard Worker // $ adb push blaze-bin/icing/result/snippet-retriever_benchmark
58*8b6cd535SAndroid Build Coastguard Worker // /data/local/tmp/
59*8b6cd535SAndroid Build Coastguard Worker //
60*8b6cd535SAndroid Build Coastguard Worker // $ adb shell /data/local/tmp/snippet-retriever_benchmark
61*8b6cd535SAndroid Build Coastguard Worker // --benchmark_filter=all --adb
62*8b6cd535SAndroid Build Coastguard Worker
63*8b6cd535SAndroid Build Coastguard Worker // Flag to tell the benchmark that it'll be run on an Android device via adb,
64*8b6cd535SAndroid Build Coastguard Worker // the benchmark will set up data files accordingly.
65*8b6cd535SAndroid Build Coastguard Worker ABSL_FLAG(bool, adb, false, "run benchmark via ADB on an Android device");
66*8b6cd535SAndroid Build Coastguard Worker
67*8b6cd535SAndroid Build Coastguard Worker namespace icing {
68*8b6cd535SAndroid Build Coastguard Worker namespace lib {
69*8b6cd535SAndroid Build Coastguard Worker
70*8b6cd535SAndroid Build Coastguard Worker namespace {
71*8b6cd535SAndroid Build Coastguard Worker
72*8b6cd535SAndroid Build Coastguard Worker using ::testing::SizeIs;
73*8b6cd535SAndroid Build Coastguard Worker
BM_SnippetOneProperty(benchmark::State & state)74*8b6cd535SAndroid Build Coastguard Worker void BM_SnippetOneProperty(benchmark::State& state) {
75*8b6cd535SAndroid Build Coastguard Worker bool run_via_adb = absl::GetFlag(FLAGS_adb);
76*8b6cd535SAndroid Build Coastguard Worker if (!run_via_adb) {
77*8b6cd535SAndroid Build Coastguard Worker ICING_ASSERT_OK(icu_data_file_helper::SetUpIcuDataFile(
78*8b6cd535SAndroid Build Coastguard Worker GetTestFilePath("icing/icu.dat")));
79*8b6cd535SAndroid Build Coastguard Worker }
80*8b6cd535SAndroid Build Coastguard Worker
81*8b6cd535SAndroid Build Coastguard Worker FeatureFlags feature_flags = GetTestFeatureFlags();
82*8b6cd535SAndroid Build Coastguard Worker const std::string base_dir = GetTestTempDir() + "/query_processor_benchmark";
83*8b6cd535SAndroid Build Coastguard Worker const std::string schema_dir = base_dir + "/schema";
84*8b6cd535SAndroid Build Coastguard Worker Filesystem filesystem;
85*8b6cd535SAndroid Build Coastguard Worker filesystem.DeleteDirectoryRecursively(base_dir.c_str());
86*8b6cd535SAndroid Build Coastguard Worker if (!filesystem.CreateDirectoryRecursively(schema_dir.c_str())) {
87*8b6cd535SAndroid Build Coastguard Worker ICING_LOG(ERROR) << "Failed to create test directories";
88*8b6cd535SAndroid Build Coastguard Worker }
89*8b6cd535SAndroid Build Coastguard Worker
90*8b6cd535SAndroid Build Coastguard Worker language_segmenter_factory::SegmenterOptions options(ULOC_US);
91*8b6cd535SAndroid Build Coastguard Worker std::unique_ptr<LanguageSegmenter> language_segmenter =
92*8b6cd535SAndroid Build Coastguard Worker language_segmenter_factory::Create(std::move(options)).ValueOrDie();
93*8b6cd535SAndroid Build Coastguard Worker std::unique_ptr<Normalizer> normalizer =
94*8b6cd535SAndroid Build Coastguard Worker normalizer_factory::Create(
95*8b6cd535SAndroid Build Coastguard Worker /*max_term_byte_size=*/std::numeric_limits<int>::max())
96*8b6cd535SAndroid Build Coastguard Worker .ValueOrDie();
97*8b6cd535SAndroid Build Coastguard Worker
98*8b6cd535SAndroid Build Coastguard Worker SchemaProto schema =
99*8b6cd535SAndroid Build Coastguard Worker SchemaBuilder()
100*8b6cd535SAndroid Build Coastguard Worker .AddType(SchemaTypeConfigBuilder().SetType("type1").AddProperty(
101*8b6cd535SAndroid Build Coastguard Worker PropertyConfigBuilder()
102*8b6cd535SAndroid Build Coastguard Worker .SetName("prop1")
103*8b6cd535SAndroid Build Coastguard Worker .SetDataTypeString(TERM_MATCH_PREFIX, TOKENIZER_PLAIN)
104*8b6cd535SAndroid Build Coastguard Worker .SetCardinality(CARDINALITY_OPTIONAL)))
105*8b6cd535SAndroid Build Coastguard Worker .Build();
106*8b6cd535SAndroid Build Coastguard Worker Clock clock;
107*8b6cd535SAndroid Build Coastguard Worker ICING_ASSERT_OK_AND_ASSIGN(
108*8b6cd535SAndroid Build Coastguard Worker std::unique_ptr<SchemaStore> schema_store,
109*8b6cd535SAndroid Build Coastguard Worker SchemaStore::Create(&filesystem, schema_dir, &clock, &feature_flags));
110*8b6cd535SAndroid Build Coastguard Worker ICING_ASSERT_OK(schema_store->SetSchema(
111*8b6cd535SAndroid Build Coastguard Worker schema, /*ignore_errors_and_delete_documents=*/false,
112*8b6cd535SAndroid Build Coastguard Worker /*allow_circular_schema_definitions=*/false));
113*8b6cd535SAndroid Build Coastguard Worker
114*8b6cd535SAndroid Build Coastguard Worker auto snippet_retriever =
115*8b6cd535SAndroid Build Coastguard Worker SnippetRetriever::Create(schema_store.get(), language_segmenter.get(),
116*8b6cd535SAndroid Build Coastguard Worker normalizer.get())
117*8b6cd535SAndroid Build Coastguard Worker .ValueOrDie();
118*8b6cd535SAndroid Build Coastguard Worker
119*8b6cd535SAndroid Build Coastguard Worker int num_matches = state.range(0);
120*8b6cd535SAndroid Build Coastguard Worker int total_terms = state.range(1);
121*8b6cd535SAndroid Build Coastguard Worker
122*8b6cd535SAndroid Build Coastguard Worker std::default_random_engine random;
123*8b6cd535SAndroid Build Coastguard Worker std::vector<std::string> language =
124*8b6cd535SAndroid Build Coastguard Worker CreateLanguages(/*language_size=*/1000, &random);
125*8b6cd535SAndroid Build Coastguard Worker std::uniform_int_distribution<size_t> uniform(0u, language.size() - 1);
126*8b6cd535SAndroid Build Coastguard Worker std::uniform_real_distribution<double> uniform_double(0.0, 1.0);
127*8b6cd535SAndroid Build Coastguard Worker
128*8b6cd535SAndroid Build Coastguard Worker std::string text;
129*8b6cd535SAndroid Build Coastguard Worker int num_actual_matches = 0;
130*8b6cd535SAndroid Build Coastguard Worker double match_chance;
131*8b6cd535SAndroid Build Coastguard Worker while (total_terms-- > 0) {
132*8b6cd535SAndroid Build Coastguard Worker std::string term;
133*8b6cd535SAndroid Build Coastguard Worker match_chance = static_cast<double>(num_matches) / total_terms;
134*8b6cd535SAndroid Build Coastguard Worker if (uniform_double(random) <= match_chance) {
135*8b6cd535SAndroid Build Coastguard Worker --num_matches;
136*8b6cd535SAndroid Build Coastguard Worker ++num_actual_matches;
137*8b6cd535SAndroid Build Coastguard Worker term = "foo";
138*8b6cd535SAndroid Build Coastguard Worker } else {
139*8b6cd535SAndroid Build Coastguard Worker term = language.at(uniform(random));
140*8b6cd535SAndroid Build Coastguard Worker }
141*8b6cd535SAndroid Build Coastguard Worker absl_ports::StrAppend(&text, " ", term);
142*8b6cd535SAndroid Build Coastguard Worker }
143*8b6cd535SAndroid Build Coastguard Worker DocumentProto document = DocumentBuilder()
144*8b6cd535SAndroid Build Coastguard Worker .SetKey("icing", "uri1")
145*8b6cd535SAndroid Build Coastguard Worker .SetSchema("type1")
146*8b6cd535SAndroid Build Coastguard Worker .AddStringProperty("prop1", text)
147*8b6cd535SAndroid Build Coastguard Worker .Build();
148*8b6cd535SAndroid Build Coastguard Worker SectionRestrictQueryTermsMap query_terms = {{"", {"foo"}}};
149*8b6cd535SAndroid Build Coastguard Worker ResultSpecProto::SnippetSpecProto snippet_spec;
150*8b6cd535SAndroid Build Coastguard Worker snippet_spec.set_num_to_snippet(100000);
151*8b6cd535SAndroid Build Coastguard Worker snippet_spec.set_num_matches_per_property(100000);
152*8b6cd535SAndroid Build Coastguard Worker snippet_spec.set_max_window_utf32_length(64);
153*8b6cd535SAndroid Build Coastguard Worker
154*8b6cd535SAndroid Build Coastguard Worker SectionIdMask section_id_mask = 0x01;
155*8b6cd535SAndroid Build Coastguard Worker SnippetProto snippet_proto;
156*8b6cd535SAndroid Build Coastguard Worker for (auto _ : state) {
157*8b6cd535SAndroid Build Coastguard Worker snippet_proto = snippet_retriever->RetrieveSnippet(
158*8b6cd535SAndroid Build Coastguard Worker query_terms, TERM_MATCH_PREFIX, snippet_spec, document,
159*8b6cd535SAndroid Build Coastguard Worker section_id_mask);
160*8b6cd535SAndroid Build Coastguard Worker ASSERT_THAT(snippet_proto.entries(), SizeIs(1));
161*8b6cd535SAndroid Build Coastguard Worker ASSERT_THAT(snippet_proto.entries(0).snippet_matches(),
162*8b6cd535SAndroid Build Coastguard Worker SizeIs(num_actual_matches));
163*8b6cd535SAndroid Build Coastguard Worker }
164*8b6cd535SAndroid Build Coastguard Worker
165*8b6cd535SAndroid Build Coastguard Worker // Destroy the schema store before the whole directory is removed because they
166*8b6cd535SAndroid Build Coastguard Worker // persist data in destructor.
167*8b6cd535SAndroid Build Coastguard Worker schema_store.reset();
168*8b6cd535SAndroid Build Coastguard Worker filesystem.DeleteDirectoryRecursively(base_dir.c_str());
169*8b6cd535SAndroid Build Coastguard Worker }
170*8b6cd535SAndroid Build Coastguard Worker BENCHMARK(BM_SnippetOneProperty)
171*8b6cd535SAndroid Build Coastguard Worker // Arguments: num_matches, total_terms
172*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(1, 1)
173*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(1, 16) // single match
174*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(2, 16) // ~10% matches
175*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(3, 16) // ~20% matches
176*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(8, 16) // 50% matches
177*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(16, 16) // 100% matches
178*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(1, 128) // single match
179*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(13, 128) // ~10% matches
180*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(26, 128) // ~20% matches
181*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(64, 128) // 50% matches
182*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(128, 128) // 100% matches
183*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(1, 512) // single match
184*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(51, 512) // ~10% matches
185*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(102, 512) // ~20% matches
186*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(256, 512) // 50% matches
187*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(512, 512) // 100% matches
188*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(1, 1024) // single match
189*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(102, 1024) // ~10% matches
190*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(205, 1024) // ~20% matches
191*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(512, 1024) // 50% matches
192*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(1024, 1024) // 100% matches
193*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(1, 4096) // single match
194*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(410, 4096) // ~10% matches
195*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(819, 4096) // ~20% matches
196*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(2048, 4096) // 50% matches
197*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(4096, 4096) // 100% matches
198*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(1, 16384) // single match
199*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(1638, 16384) // ~10% matches
200*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(3277, 16384) // ~20% matches
201*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(8192, 16384) // 50% matches
202*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(16384, 16384); // 100% matches
203*8b6cd535SAndroid Build Coastguard Worker
BM_SnippetRfcOneProperty(benchmark::State & state)204*8b6cd535SAndroid Build Coastguard Worker void BM_SnippetRfcOneProperty(benchmark::State& state) {
205*8b6cd535SAndroid Build Coastguard Worker bool run_via_adb = absl::GetFlag(FLAGS_adb);
206*8b6cd535SAndroid Build Coastguard Worker if (!run_via_adb) {
207*8b6cd535SAndroid Build Coastguard Worker ICING_ASSERT_OK(icu_data_file_helper::SetUpIcuDataFile(
208*8b6cd535SAndroid Build Coastguard Worker GetTestFilePath("icing/icu.dat")));
209*8b6cd535SAndroid Build Coastguard Worker }
210*8b6cd535SAndroid Build Coastguard Worker
211*8b6cd535SAndroid Build Coastguard Worker FeatureFlags feature_flags = GetTestFeatureFlags();
212*8b6cd535SAndroid Build Coastguard Worker const std::string base_dir = GetTestTempDir() + "/query_processor_benchmark";
213*8b6cd535SAndroid Build Coastguard Worker const std::string schema_dir = base_dir + "/schema";
214*8b6cd535SAndroid Build Coastguard Worker Filesystem filesystem;
215*8b6cd535SAndroid Build Coastguard Worker filesystem.DeleteDirectoryRecursively(base_dir.c_str());
216*8b6cd535SAndroid Build Coastguard Worker if (!filesystem.CreateDirectoryRecursively(schema_dir.c_str())) {
217*8b6cd535SAndroid Build Coastguard Worker ICING_LOG(ERROR) << "Failed to create test directories";
218*8b6cd535SAndroid Build Coastguard Worker }
219*8b6cd535SAndroid Build Coastguard Worker
220*8b6cd535SAndroid Build Coastguard Worker language_segmenter_factory::SegmenterOptions options(ULOC_US);
221*8b6cd535SAndroid Build Coastguard Worker std::unique_ptr<LanguageSegmenter> language_segmenter =
222*8b6cd535SAndroid Build Coastguard Worker language_segmenter_factory::Create(std::move(options)).ValueOrDie();
223*8b6cd535SAndroid Build Coastguard Worker std::unique_ptr<Normalizer> normalizer =
224*8b6cd535SAndroid Build Coastguard Worker normalizer_factory::Create(
225*8b6cd535SAndroid Build Coastguard Worker /*max_term_byte_size=*/std::numeric_limits<int>::max())
226*8b6cd535SAndroid Build Coastguard Worker .ValueOrDie();
227*8b6cd535SAndroid Build Coastguard Worker
228*8b6cd535SAndroid Build Coastguard Worker SchemaProto schema =
229*8b6cd535SAndroid Build Coastguard Worker SchemaBuilder()
230*8b6cd535SAndroid Build Coastguard Worker .AddType(SchemaTypeConfigBuilder().SetType("type1").AddProperty(
231*8b6cd535SAndroid Build Coastguard Worker PropertyConfigBuilder()
232*8b6cd535SAndroid Build Coastguard Worker .SetName("prop1")
233*8b6cd535SAndroid Build Coastguard Worker .SetDataTypeString(TERM_MATCH_PREFIX, TOKENIZER_PLAIN)
234*8b6cd535SAndroid Build Coastguard Worker .SetCardinality(CARDINALITY_OPTIONAL)))
235*8b6cd535SAndroid Build Coastguard Worker .Build();
236*8b6cd535SAndroid Build Coastguard Worker Clock clock;
237*8b6cd535SAndroid Build Coastguard Worker ICING_ASSERT_OK_AND_ASSIGN(
238*8b6cd535SAndroid Build Coastguard Worker std::unique_ptr<SchemaStore> schema_store,
239*8b6cd535SAndroid Build Coastguard Worker SchemaStore::Create(&filesystem, schema_dir, &clock, &feature_flags));
240*8b6cd535SAndroid Build Coastguard Worker ICING_ASSERT_OK(schema_store->SetSchema(
241*8b6cd535SAndroid Build Coastguard Worker schema, /*ignore_errors_and_delete_documents=*/false,
242*8b6cd535SAndroid Build Coastguard Worker /*allow_circular_schema_definitions=*/false));
243*8b6cd535SAndroid Build Coastguard Worker
244*8b6cd535SAndroid Build Coastguard Worker auto snippet_retriever =
245*8b6cd535SAndroid Build Coastguard Worker SnippetRetriever::Create(schema_store.get(), language_segmenter.get(),
246*8b6cd535SAndroid Build Coastguard Worker normalizer.get())
247*8b6cd535SAndroid Build Coastguard Worker .ValueOrDie();
248*8b6cd535SAndroid Build Coastguard Worker
249*8b6cd535SAndroid Build Coastguard Worker int num_matches = state.range(0);
250*8b6cd535SAndroid Build Coastguard Worker int total_terms = state.range(1);
251*8b6cd535SAndroid Build Coastguard Worker
252*8b6cd535SAndroid Build Coastguard Worker std::default_random_engine random;
253*8b6cd535SAndroid Build Coastguard Worker std::vector<std::string> language =
254*8b6cd535SAndroid Build Coastguard Worker CreateLanguages(/*language_size=*/1000, &random);
255*8b6cd535SAndroid Build Coastguard Worker std::uniform_int_distribution<size_t> uniform(0u, language.size() - 1);
256*8b6cd535SAndroid Build Coastguard Worker std::uniform_real_distribution<double> uniform_double(0.0, 1.0);
257*8b6cd535SAndroid Build Coastguard Worker
258*8b6cd535SAndroid Build Coastguard Worker std::string text;
259*8b6cd535SAndroid Build Coastguard Worker int num_actual_matches = 0;
260*8b6cd535SAndroid Build Coastguard Worker double match_chance;
261*8b6cd535SAndroid Build Coastguard Worker while (total_terms-- > 0) {
262*8b6cd535SAndroid Build Coastguard Worker std::string term;
263*8b6cd535SAndroid Build Coastguard Worker match_chance = static_cast<double>(num_matches) / total_terms;
264*8b6cd535SAndroid Build Coastguard Worker if (uniform_double(random) <= match_chance) {
265*8b6cd535SAndroid Build Coastguard Worker --num_matches;
266*8b6cd535SAndroid Build Coastguard Worker ++num_actual_matches;
267*8b6cd535SAndroid Build Coastguard Worker term = "[email protected]";
268*8b6cd535SAndroid Build Coastguard Worker } else {
269*8b6cd535SAndroid Build Coastguard Worker term = absl_ports::StrCat(language.at(uniform(random)), "@google.com");
270*8b6cd535SAndroid Build Coastguard Worker }
271*8b6cd535SAndroid Build Coastguard Worker absl_ports::StrAppend(&text, ",", term);
272*8b6cd535SAndroid Build Coastguard Worker }
273*8b6cd535SAndroid Build Coastguard Worker DocumentProto document = DocumentBuilder()
274*8b6cd535SAndroid Build Coastguard Worker .SetKey("icing", "uri1")
275*8b6cd535SAndroid Build Coastguard Worker .SetSchema("type1")
276*8b6cd535SAndroid Build Coastguard Worker .AddStringProperty("prop1", text)
277*8b6cd535SAndroid Build Coastguard Worker .Build();
278*8b6cd535SAndroid Build Coastguard Worker SectionRestrictQueryTermsMap query_terms = {{"", {"foo"}}};
279*8b6cd535SAndroid Build Coastguard Worker ResultSpecProto::SnippetSpecProto snippet_spec;
280*8b6cd535SAndroid Build Coastguard Worker snippet_spec.set_num_to_snippet(100000);
281*8b6cd535SAndroid Build Coastguard Worker snippet_spec.set_num_matches_per_property(100000);
282*8b6cd535SAndroid Build Coastguard Worker snippet_spec.set_max_window_utf32_length(64);
283*8b6cd535SAndroid Build Coastguard Worker
284*8b6cd535SAndroid Build Coastguard Worker SectionIdMask section_id_mask = 0x01;
285*8b6cd535SAndroid Build Coastguard Worker SnippetProto snippet_proto;
286*8b6cd535SAndroid Build Coastguard Worker for (auto _ : state) {
287*8b6cd535SAndroid Build Coastguard Worker snippet_proto = snippet_retriever->RetrieveSnippet(
288*8b6cd535SAndroid Build Coastguard Worker query_terms, TERM_MATCH_PREFIX, snippet_spec, document,
289*8b6cd535SAndroid Build Coastguard Worker section_id_mask);
290*8b6cd535SAndroid Build Coastguard Worker ASSERT_THAT(snippet_proto.entries(), SizeIs(1));
291*8b6cd535SAndroid Build Coastguard Worker ASSERT_THAT(snippet_proto.entries(0).snippet_matches(),
292*8b6cd535SAndroid Build Coastguard Worker SizeIs(num_actual_matches));
293*8b6cd535SAndroid Build Coastguard Worker }
294*8b6cd535SAndroid Build Coastguard Worker
295*8b6cd535SAndroid Build Coastguard Worker // Destroy the schema store before the whole directory is removed because they
296*8b6cd535SAndroid Build Coastguard Worker // persist data in destructor.
297*8b6cd535SAndroid Build Coastguard Worker schema_store.reset();
298*8b6cd535SAndroid Build Coastguard Worker filesystem.DeleteDirectoryRecursively(base_dir.c_str());
299*8b6cd535SAndroid Build Coastguard Worker }
300*8b6cd535SAndroid Build Coastguard Worker BENCHMARK(BM_SnippetRfcOneProperty)
301*8b6cd535SAndroid Build Coastguard Worker // Arguments: num_matches, total_terms
302*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(1, 1)
303*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(1, 16) // single match
304*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(2, 16) // ~10% matches
305*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(3, 16) // ~20% matches
306*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(8, 16) // 50% matches
307*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(16, 16) // 100% matches
308*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(1, 128) // single match
309*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(13, 128) // ~10% matches
310*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(26, 128) // ~20% matches
311*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(64, 128) // 50% matches
312*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(128, 128) // 100% matches
313*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(1, 512) // single match
314*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(51, 512) // ~10% matches
315*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(102, 512) // ~20% matches
316*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(256, 512) // 50% matches
317*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(512, 512) // 100% matches
318*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(1, 1024) // single match
319*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(102, 1024) // ~10% matches
320*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(205, 1024) // ~20% matches
321*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(512, 1024) // 50% matches
322*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(1024, 1024) // 100% matches
323*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(1, 4096) // single match
324*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(410, 4096) // ~10% matches
325*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(819, 4096) // ~20% matches
326*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(2048, 4096) // 50% matches
327*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(4096, 4096) // 100% matches
328*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(1, 16384) // single match
329*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(1638, 16384) // ~10% matches
330*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(3277, 16384) // ~20% matches
331*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(8192, 16384) // 50% matches
332*8b6cd535SAndroid Build Coastguard Worker ->ArgPair(16384, 16384); // 100% matches
333*8b6cd535SAndroid Build Coastguard Worker
334*8b6cd535SAndroid Build Coastguard Worker } // namespace
335*8b6cd535SAndroid Build Coastguard Worker
336*8b6cd535SAndroid Build Coastguard Worker } // namespace lib
337*8b6cd535SAndroid Build Coastguard Worker } // namespace icing
338