[clang-tools-extra] db2a646 - [clangd] Add bencmark for measuring latency of DecisionForest model.

Utkarsh Saxena via cfe-commits cfe-commits at lists.llvm.org
Fri Oct 2 09:04:46 PDT 2020


Author: Utkarsh Saxena
Date: 2020-10-02T18:04:31+02:00
New Revision: db2a646c5f002cc16d02d6fac0b2d715cdd4a809

URL: https://github.com/llvm/llvm-project/commit/db2a646c5f002cc16d02d6fac0b2d715cdd4a809
DIFF: https://github.com/llvm/llvm-project/commit/db2a646c5f002cc16d02d6fac0b2d715cdd4a809.diff

LOG: [clangd] Add bencmark for measuring latency of DecisionForest model.

Differential Revision: https://reviews.llvm.org/D88590

Added: 
    clang-tools-extra/clangd/benchmarks/CompletionModel/CMakeLists.txt
    clang-tools-extra/clangd/benchmarks/CompletionModel/DecisionForestBenchmark.cpp

Modified: 
    clang-tools-extra/clangd/benchmarks/CMakeLists.txt

Removed: 
    


################################################################################
diff  --git a/clang-tools-extra/clangd/benchmarks/CMakeLists.txt b/clang-tools-extra/clangd/benchmarks/CMakeLists.txt
index 1f3d88b42bce..b62ffd7a1ad1 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 000000000000..3998aa122533
--- /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 000000000000..69ce65e08b77
--- /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 <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();


        


More information about the cfe-commits mailing list