xref: /llvm-project/clang-tools-extra/clangd/benchmarks/CompletionModel/DecisionForestBenchmark.cpp (revision 0ed2bd9311fd54f0b414549b96a2cd4036ef0945)
1db2a646cSUtkarsh Saxena //===--- DecisionForestBenchmark.cpp ------------*- C++ -*-===//
2db2a646cSUtkarsh Saxena //
3db2a646cSUtkarsh Saxena // Benchmark for code completion ranking latency.
4db2a646cSUtkarsh Saxena //
5db2a646cSUtkarsh Saxena // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
6db2a646cSUtkarsh Saxena // See https://llvm.org/LICENSE.txt for license information.
7db2a646cSUtkarsh Saxena // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
8db2a646cSUtkarsh Saxena //
9db2a646cSUtkarsh Saxena // Usage:
10db2a646cSUtkarsh Saxena //    ninja DecisionForestBenchmark && \
11db2a646cSUtkarsh Saxena //    tools/clang/tools/extra/clangd/benchmarks/CompletionModel/DecisionForestBenchmark
12db2a646cSUtkarsh Saxena //===----------------------------------------------------------------------===//
13db2a646cSUtkarsh Saxena 
14db2a646cSUtkarsh Saxena #include "CompletionModel.h"
15db2a646cSUtkarsh Saxena #include "benchmark/benchmark.h"
16db2a646cSUtkarsh Saxena #include "llvm/ADT/StringRef.h"
17db2a646cSUtkarsh Saxena 
18db2a646cSUtkarsh Saxena #include <random>
19db2a646cSUtkarsh Saxena 
20db2a646cSUtkarsh Saxena namespace clang {
21db2a646cSUtkarsh Saxena namespace clangd {
22db2a646cSUtkarsh Saxena namespace {
generateRandomDataset(int NumExamples)23db2a646cSUtkarsh Saxena std::vector<Example> generateRandomDataset(int NumExamples) {
24bad8e577SUtkarsh Saxena   auto FlipCoin = [&](double Probability) {
25db2a646cSUtkarsh Saxena     return rand() % 1000 <= Probability * 1000;
26db2a646cSUtkarsh Saxena   };
27db2a646cSUtkarsh Saxena   auto RandInt = [&](int Max) { return rand() % Max; };
28db2a646cSUtkarsh Saxena   auto RandFloat = [&](float Max = 1.0) {
29db2a646cSUtkarsh Saxena     return rand() % 1000 / 1000.0 * Max;
30db2a646cSUtkarsh Saxena   };
31db2a646cSUtkarsh Saxena 
32db2a646cSUtkarsh Saxena   std::vector<Example> Examples;
33db2a646cSUtkarsh Saxena   Examples.reserve(NumExamples);
34db2a646cSUtkarsh Saxena   for (int I = 0; I < NumExamples; ++I) {
35db2a646cSUtkarsh Saxena     Example E;
36db2a646cSUtkarsh Saxena     E.setIsDeprecated(FlipCoin(0.1));           // Boolean.
37db2a646cSUtkarsh Saxena     E.setIsReservedName(FlipCoin(0.1));         // Boolean.
38db2a646cSUtkarsh Saxena     E.setIsImplementationDetail(FlipCoin(0.3)); // Boolean.
39db2a646cSUtkarsh Saxena     E.setNumReferences(RandInt(10000));         // Can be large integer.
40db2a646cSUtkarsh Saxena     E.setSymbolCategory(RandInt(10));           // 10 Symbol Category.
41bad8e577SUtkarsh Saxena     E.setNumNameInContext(RandInt(20));         // 0 to ContextWords->size().
42bad8e577SUtkarsh Saxena     E.setFractionNameInContext(RandFloat(1.0)); // Float in range [0,1].
43db2a646cSUtkarsh Saxena     E.setIsNameInContext(FlipCoin(0.5)); // Boolean.
44db2a646cSUtkarsh Saxena     E.setIsInBaseClass(FlipCoin(0.3));   // Boolean.
45bad8e577SUtkarsh Saxena     E.setFileProximityDistanceCost(
46db2a646cSUtkarsh Saxena         FlipCoin(0.1) ? 999999 // Sometimes file distance is not available.
47db2a646cSUtkarsh Saxena                       : RandInt(20));
48db2a646cSUtkarsh Saxena     E.setSemaFileProximityScore(RandFloat(1)); // Float in range [0,1].
49bad8e577SUtkarsh Saxena     E.setSymbolScopeDistanceCost(
50db2a646cSUtkarsh Saxena         FlipCoin(0.1) ? 999999 // Sometimes scope distance is not available.
51db2a646cSUtkarsh Saxena                       : RandInt(20));
52db2a646cSUtkarsh Saxena     E.setSemaSaysInScope(FlipCoin(0.5));      // Boolean.
53db2a646cSUtkarsh Saxena     E.setScope(RandInt(4));                   // 4 Scopes.
54bf935a03SUtkarsh Saxena     E.setContextKind(RandInt(36));            // 36 Context kinds.
55db2a646cSUtkarsh Saxena     E.setIsInstanceMember(FlipCoin(0.5));     // Boolean.
56db2a646cSUtkarsh Saxena     E.setHadContextType(FlipCoin(0.6));       // Boolean.
57db2a646cSUtkarsh Saxena     E.setHadSymbolType(FlipCoin(0.6));        // Boolean.
58db2a646cSUtkarsh Saxena     E.setTypeMatchesPreferred(FlipCoin(0.5)); // Boolean.
59db2a646cSUtkarsh Saxena     Examples.push_back(E);
60db2a646cSUtkarsh Saxena   }
61db2a646cSUtkarsh Saxena   return Examples;
62db2a646cSUtkarsh Saxena }
63db2a646cSUtkarsh Saxena 
runDecisionForestPrediction(const std::vector<Example> Examples)64*0ed2bd93SGabriel Ravier void runDecisionForestPrediction(const std::vector<Example> Examples) {
65db2a646cSUtkarsh Saxena   for (const Example &E : Examples)
66db2a646cSUtkarsh Saxena     Evaluate(E);
67db2a646cSUtkarsh Saxena }
68db2a646cSUtkarsh Saxena 
decisionForestPredict(benchmark::State & State)69db2a646cSUtkarsh Saxena static void decisionForestPredict(benchmark::State &State) {
70db2a646cSUtkarsh Saxena   srand(0);
71db2a646cSUtkarsh Saxena   for (auto _ : State) {
72db2a646cSUtkarsh Saxena     State.PauseTiming();
73db2a646cSUtkarsh Saxena     const std::vector<Example> Examples = generateRandomDataset(1000000);
74db2a646cSUtkarsh Saxena     State.ResumeTiming();
75*0ed2bd93SGabriel Ravier     runDecisionForestPrediction(Examples);
76db2a646cSUtkarsh Saxena   }
77db2a646cSUtkarsh Saxena }
78db2a646cSUtkarsh Saxena BENCHMARK(decisionForestPredict);
79db2a646cSUtkarsh Saxena 
80db2a646cSUtkarsh Saxena } // namespace
81db2a646cSUtkarsh Saxena } // namespace clangd
82db2a646cSUtkarsh Saxena } // namespace clang
83db2a646cSUtkarsh Saxena 
84db2a646cSUtkarsh Saxena BENCHMARK_MAIN();
85