You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
86 lines
2.9 KiB
86 lines
2.9 KiB
//===--- 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();
|