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 Saxenastd::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 Raviervoid 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 Saxenastatic 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