//===--- 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 namespace clang { namespace clangd { namespace { std::vector 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 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 Examples) { for (const Example &E : Examples) Evaluate(E); } static void decisionForestPredict(benchmark::State &State) { srand(0); for (auto _ : State) { State.PauseTiming(); const std::vector Examples = generateRandomDataset(1000000); State.ResumeTiming(); runDecisionForestPrediciton(Examples); } } BENCHMARK(decisionForestPredict); } // namespace } // namespace clangd } // namespace clang BENCHMARK_MAIN();