[clang-tools-extra] [clang-doc] Add basic benchmarks for library functionality (PR #182620)
Carlos Alberto Enciso via cfe-commits
cfe-commits at lists.llvm.org
Fri Mar 6 02:28:43 PST 2026
================
@@ -0,0 +1,234 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// This file contains basic benchmarks for clang-doc's implementation and
+/// library components.
+///
+//===----------------------------------------------------------------------===//
+
+#include "BitcodeReader.h"
+#include "BitcodeWriter.h"
+#include "ClangDoc.h"
+#include "Generators.h"
+#include "Representation.h"
+#include "Serialize.h"
+#include "benchmark/benchmark.h"
+#include "clang/AST/ASTContext.h"
+#include "clang/AST/RecursiveASTVisitor.h"
+#include "clang/Tooling/Execution.h"
+#include "clang/Tooling/Tooling.h"
+#include "llvm/Bitstream/BitstreamWriter.h"
+#include <string>
+#include <vector>
+
+namespace clang {
+namespace doc {
+
+class BenchmarkVisitor : public RecursiveASTVisitor<BenchmarkVisitor> {
+public:
+ explicit BenchmarkVisitor(const FunctionDecl *&Func) : Func(Func) {}
+
+ bool VisitFunctionDecl(const FunctionDecl *D) {
+ if (D->getName() == "f") {
+ Func = D;
+ return false;
+ }
+ return true;
+ }
+
+private:
+ const FunctionDecl *&Func;
+};
+
+// --- Mapper Benchmarks ---
+
+static void BM_EmitInfoFunction(benchmark::State &State) {
+ std::string Code = "void f() {}";
+ std::unique_ptr<clang::ASTUnit> AST = clang::tooling::buildASTFromCode(Code);
+ const FunctionDecl *Func = nullptr;
+ BenchmarkVisitor Visitor(Func);
+ Visitor.TraverseDecl(AST->getASTContext().getTranslationUnitDecl());
+ assert(Func);
+
+ clang::comments::FullComment *FC = nullptr;
+ Location Loc;
+
+ for (auto _ : State) {
+ auto Result = serialize::emitInfo(Func, FC, Loc, /*PublicOnly=*/false);
+ benchmark::DoNotOptimize(Result);
+ }
+}
+BENCHMARK(BM_EmitInfoFunction);
+
+static void BM_Mapper_Scale(benchmark::State &State) {
+ std::string Code;
+ for (int i = 0; i < State.range(0); ++i) {
+ Code += "void f" + std::to_string(i) + "() {}\n";
+ }
+
+ IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs());
+ DiagnosticOptions DiagOpts;
+ DiagnosticsEngine Diags(DiagID, DiagOpts, new IgnoringDiagConsumer());
+
+ for (auto _ : State) {
+ tooling::InMemoryToolResults Results;
+ tooling::ExecutionContext ECtx(&Results);
+ ClangDocContext CDCtx(&ECtx, "test-project", false, "", "", "", "", "", {},
+ Diags, false);
----------------
CarlosAlbertoEnciso wrote:
The `false` value can not be converted to the `OutputFormatTy` type.
https://github.com/llvm/llvm-project/pull/182620
More information about the cfe-commits
mailing list