21#include "benchmark/benchmark.h"
22#include "clang/AST/ASTContext.h"
23#include "clang/AST/RecursiveASTVisitor.h"
24#include "clang/Tooling/Execution.h"
25#include "clang/Tooling/Tooling.h"
26#include "llvm/Bitstream/BitstreamWriter.h"
38 if (D->getName() ==
"f") {
46 const FunctionDecl *&Func;
52 std::string Code =
"void f() {}";
54 const FunctionDecl *Func =
nullptr;
56 Visitor.TraverseDecl(AST->getASTContext().getTranslationUnitDecl());
59 clang::comments::FullComment *FC =
nullptr;
62 for (
auto _ : State) {
64 auto Result = Serializer.
emitInfo(Func, FC, Loc,
false);
65 benchmark::DoNotOptimize(Result);
72 for (
int i = 0; i < State.range(0); ++i) {
73 Code +=
"void f" + std::to_string(i) +
"() {}\n";
76 IntrusiveRefCntPtr<DiagnosticIDs> DiagID(
new DiagnosticIDs());
77 DiagnosticOptions DiagOpts;
78 DiagnosticsEngine Diags(DiagID, DiagOpts,
new IgnoringDiagConsumer());
80 for (
auto _ : State) {
81 tooling::InMemoryToolResults Results;
82 tooling::ExecutionContext ECtx(&Results);
83 ClangDocContext CDCtx(&ECtx,
"test-project",
false,
"",
"",
"",
"",
"", {},
87 tooling::runToolOnCode(std::move(Action), Code,
"test.cpp");
97 I->DefLoc =
Location(0, 0,
"test.cpp");
101 IntrusiveRefCntPtr<DiagnosticIDs> DiagID(
new DiagnosticIDs());
102 DiagnosticOptions DiagOpts;
103 DiagnosticsEngine Diags(DiagID, DiagOpts,
new IgnoringDiagConsumer());
107 for (
auto _ : State) {
109 benchmark::DoNotOptimize(Result);
115 SymbolID USR = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
116 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
118 for (
auto _ : State) {
121 Input.reserve(State.range(0));
122 for (
int i = 0; i < State.range(0); ++i) {
126 I->DefLoc =
Location(10, i,
"test.cpp");
127 Input.push_back(std::move(I));
129 State.ResumeTiming();
133 State.SkipWithError(
"mergeInfos failed");
134 llvm::consumeError(Result.takeError());
136 benchmark::DoNotOptimize(Result);
142 int NumRecords = State.range(0);
144 SmallString<0> Buffer;
145 llvm::BitstreamWriter Stream(Buffer);
146 IntrusiveRefCntPtr<DiagnosticIDs> DiagID(
new DiagnosticIDs());
147 DiagnosticOptions DiagOpts;
148 DiagnosticsEngine Diags(DiagID, DiagOpts,
new IgnoringDiagConsumer());
151 for (
int i = 0; i < NumRecords; ++i) {
153 RI.
Name =
"Record" + std::to_string(i);
154 RI.
USR = {(uint8_t)(i & 0xFF)};
158 std::string BitcodeData = Buffer.str().str();
160 for (
auto _ : State) {
161 llvm::BitstreamCursor Cursor(llvm::ArrayRef<uint8_t>(
162 (
const uint8_t *)BitcodeData.data(), BitcodeData.size()));
166 State.SkipWithError(
"readBitcode failed");
167 llvm::consumeError(Result.takeError());
169 benchmark::DoNotOptimize(Result);
179 State.SkipWithError(
"JSON Generator not found");
180 llvm::consumeError(G.takeError());
184 int NumRecords = State.range(0);
186 NI->Name =
"GlobalNamespace";
187 for (
int i = 0; i < NumRecords; ++i) {
188 NI->Children.Records.emplace_back(
SymbolID{(uint8_t)(i & 0xFF)},
189 "Record" + std::to_string(i),
193 IntrusiveRefCntPtr<DiagnosticIDs> DiagID(
new DiagnosticIDs());
194 DiagnosticOptions DiagOpts;
195 DiagnosticsEngine Diags(DiagID, DiagOpts,
new IgnoringDiagConsumer());
196 ClangDocContext CDCtx(
nullptr,
"test-project",
false,
"",
"",
"",
"",
"", {},
200 llvm::raw_string_ostream OS(Output);
202 for (
auto _ : State) {
204 auto Err = (*G)->generateDocForInfo(
getPtr(NI), OS, CDCtx);
206 State.SkipWithError(
"generateDocForInfo failed");
207 llvm::consumeError(std::move(Err));
209 benchmark::DoNotOptimize(Output);
217 for (
auto _ : State) {
219 for (
int i = 0; i < State.range(0); ++i) {
221 I.
Name =
"Record" + std::to_string(i);
223 I.
USR = {(uint8_t)(i & 0xFF), (uint8_t)((i >> 8) & 0xFF)};
224 I.
Path =
"path/to/record";
227 benchmark::DoNotOptimize(Idx);
bool VisitFunctionDecl(const FunctionDecl *D)
BenchmarkVisitor(const FunctionDecl *&Func)
llvm::Expected< OwningPtrArray< Info > > readBitcode()
void emitBlock(const NamespaceInfo &I)
static void addInfoToIndex(Index &Idx, const doc::Info *Info)
std::pair< OwnedPtr< Info >, OwnedPtr< Info > > emitInfo(const NamespaceDecl *D, const FullComment *FC, Location Loc, bool PublicOnly)
static std::string serialize(T &I, DiagnosticsEngine &Diags)
static void BM_BitcodeReader_Scale(benchmark::State &State)
static void BM_MergeInfos_Scale(benchmark::State &State)
llvm::Expected< OwnedPtr< Info > > mergeInfos(OwningPtrArray< Info > &Values)
llvm::Expected< std::unique_ptr< Generator > > findGeneratorByName(llvm::StringRef Format)
OwnedPtr< tooling::FrontendActionFactory > newMapperActionFactory(ClangDocContext CDCtx)
std::unique_ptr< T > OwnedPtr
T * getPtr(const OwnedPtr< T > &O)
BENCHMARK(BM_EmitInfoFunction)
std::vector< OwnedPtr< T > > OwningPtrArray
static void BM_EmitInfoFunction(benchmark::State &State)
static void BM_Index_Insertion(benchmark::State &State)
static void BM_SerializeFunctionInfo(benchmark::State &State)
OwnedPtr< T > allocatePtr(Args &&...args)
std::array< uint8_t, 20 > SymbolID
static void BM_JSONGenerator_Scale(benchmark::State &State)
static void BM_Mapper_Scale(benchmark::State &State)
===– Representation.cpp - ClangDoc Representation --------—*- C++ -*-===//
llvm::SmallString< 128 > Path