From db2a646c5f002cc16d02d6fac0b2d715cdd4a809 Mon Sep 17 00:00:00 2001 From: Utkarsh Saxena Date: Wed, 30 Sep 2020 14:57:47 +0200 Subject: [PATCH] [clangd] Add bencmark for measuring latency of DecisionForest model. Differential Revision: https://reviews.llvm.org/D88590 --- clang-tools-extra/clangd/benchmarks/CMakeLists.txt | 2 + .../benchmarks/CompletionModel/CMakeLists.txt | 9 +++ .../CompletionModel/DecisionForestBenchmark.cpp | 85 ++++++++++++++++++++++ 3 files changed, 96 insertions(+) create mode 100644 clang-tools-extra/clangd/benchmarks/CompletionModel/CMakeLists.txt create mode 100644 clang-tools-extra/clangd/benchmarks/CompletionModel/DecisionForestBenchmark.cpp diff --git a/clang-tools-extra/clangd/benchmarks/CMakeLists.txt b/clang-tools-extra/clangd/benchmarks/CMakeLists.txt index 1f3d88b..b62ffd7 100644 --- a/clang-tools-extra/clangd/benchmarks/CMakeLists.txt +++ b/clang-tools-extra/clangd/benchmarks/CMakeLists.txt @@ -1,5 +1,7 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../) +add_subdirectory(CompletionModel) + add_benchmark(IndexBenchmark IndexBenchmark.cpp) target_link_libraries(IndexBenchmark diff --git a/clang-tools-extra/clangd/benchmarks/CompletionModel/CMakeLists.txt b/clang-tools-extra/clangd/benchmarks/CompletionModel/CMakeLists.txt new file mode 100644 index 0000000..3998aa1 --- /dev/null +++ b/clang-tools-extra/clangd/benchmarks/CompletionModel/CMakeLists.txt @@ -0,0 +1,9 @@ +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../) + +add_benchmark(DecisionForestBenchmark DecisionForestBenchmark.cpp) + +target_link_libraries(DecisionForestBenchmark + PRIVATE + clangDaemon + LLVMSupport + ) diff --git a/clang-tools-extra/clangd/benchmarks/CompletionModel/DecisionForestBenchmark.cpp b/clang-tools-extra/clangd/benchmarks/CompletionModel/DecisionForestBenchmark.cpp new file mode 100644 index 0000000..69ce65e --- /dev/null +++ b/clang-tools-extra/clangd/benchmarks/CompletionModel/DecisionForestBenchmark.cpp @@ -0,0 +1,85 @@ +//===--- 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(); -- 2.7.4