| //===--- DecisionForestBenchmark.cpp ------------*- C++ -*-===// |
| // |
| // Benchmark for code completion ranking latency. |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| // Usage: |
| // ninja DecisionForestBenchmark && \ |
| // tools/clang/tools/extra/clangd/benchmarks/CompletionModel/DecisionForestBenchmark |
| //===----------------------------------------------------------------------===// |
| |
| #include "CompletionModel.h" |
| #include "benchmark/benchmark.h" |
| #include "llvm/ADT/StringRef.h" |
| |
| #include <random> |
| |
| namespace clang { |
| namespace clangd { |
| namespace { |
| std::vector<Example> generateRandomDataset(int NumExamples) { |
| auto FlipCoin = [&](float Probability) { |
| return rand() % 1000 <= Probability * 1000; |
| }; |
| auto RandInt = [&](int Max) { return rand() % Max; }; |
| auto RandFloat = [&](float Max = 1.0) { |
| return rand() % 1000 / 1000.0 * Max; |
| }; |
| |
| std::vector<Example> Examples; |
| Examples.reserve(NumExamples); |
| for (int I = 0; I < NumExamples; ++I) { |
| Example E; |
| E.setIsDeprecated(FlipCoin(0.1)); // Boolean. |
| E.setIsReservedName(FlipCoin(0.1)); // Boolean. |
| E.setIsImplementationDetail(FlipCoin(0.3)); // Boolean. |
| E.setNumReferences(RandInt(10000)); // Can be large integer. |
| E.setSymbolCategory(RandInt(10)); // 10 Symbol Category. |
| |
| E.setIsNameInContext(FlipCoin(0.5)); // Boolean. |
| E.setIsForbidden(FlipCoin(0.1)); // Boolean. |
| E.setIsInBaseClass(FlipCoin(0.3)); // Boolean. |
| E.setFileProximityDistance( |
| FlipCoin(0.1) ? 999999 // Sometimes file distance is not available. |
| : RandInt(20)); |
| E.setSemaFileProximityScore(RandFloat(1)); // Float in range [0,1]. |
| E.setSymbolScopeDistance( |
| FlipCoin(0.1) ? 999999 // Sometimes scope distance is not available. |
| : RandInt(20)); |
| E.setSemaSaysInScope(FlipCoin(0.5)); // Boolean. |
| E.setScope(RandInt(4)); // 4 Scopes. |
| E.setContextKind(RandInt(32)); // 32 Context kinds. |
| E.setIsInstanceMember(FlipCoin(0.5)); // Boolean. |
| E.setHadContextType(FlipCoin(0.6)); // Boolean. |
| E.setHadSymbolType(FlipCoin(0.6)); // Boolean. |
| E.setTypeMatchesPreferred(FlipCoin(0.5)); // Boolean. |
| E.setFilterLength(RandInt(15)); |
| Examples.push_back(E); |
| } |
| return Examples; |
| } |
| |
| void runDecisionForestPrediciton(const std::vector<Example> Examples) { |
| for (const Example &E : Examples) |
| Evaluate(E); |
| } |
| |
| static void decisionForestPredict(benchmark::State &State) { |
| srand(0); |
| for (auto _ : State) { |
| State.PauseTiming(); |
| const std::vector<Example> Examples = generateRandomDataset(1000000); |
| State.ResumeTiming(); |
| runDecisionForestPrediciton(Examples); |
| } |
| } |
| BENCHMARK(decisionForestPredict); |
| |
| } // namespace |
| } // namespace clangd |
| } // namespace clang |
| |
| BENCHMARK_MAIN(); |