विषय पर बढ़ें

अंतिम अद्यतन:2026-10-12

Google Benchmark performance testing

《C++那些事》 का अपना BenchMark testing शुरू करना

0. प्रस्तावना

इस section का लक्ष्य: एक BenchMark छोटा project पूरा करना!

रोज़मर्रा के development में, अपने interface की performance कैसे test करें? C++ में BenchMark testing framework जल्दी कैसे बनाएँ?

इस section में Step By Step BenchMark की शुरुआत का पहला पाठ शुरू करेंगे।

1. Project structure

हम vector और list insertion का उदाहरण लेकर BenchMark project समझाते हैं।

इस बार का project Bazel से manage होता है, अगर आपको अभी संबंधित environment configure करना नहीं आता, तो पहले के video courses/documentation देखें।

एक project structure बनाएँ:


BenchMark google के open source project उपयोग करता है:

https://github.com/google/benchmark.git

पहले की तरह थर्ड-पार्टी लाइब्रेरी उपयोग करने के लिए खुद source compile करके so library बनाकर link करना पड़ता था, बहुत परेशानी थी! यहाँ सीधे bazel management उपयोग करते हैं, बस WORKSPACE में dependency का git project जोड़ना है, जैसे यहाँ google benchmark का v1.7.1 version उपयोग किया गया है।

git_repository(
    name = "google_benchmark",
    remote = "https://github.com/google/benchmark.git",
    tag = "v1.7.1",
)

इसके बाद, हमें main logic implement करना है, एक src directory बनाएँ, उसमें एक BUILD फ़ाइल जोड़ें: उद्देश्य cpp फ़ाइलों को compile करना है, ध्यान दें: यहाँ benchmark library की dependency है, उपयोग का तरीका है @पहले configure किया गया name//:benchmark

cc_binary(
    name = "vector_list",
    srcs = ["vector_list.cc"],
    deps = [
        "@google_benchmark//:benchmark",
    ]
)

इस तरह cc फ़ाइल में उपयोग किया जा सकता है:

#include <benchmark/benchmark.h>

2. Demo चरण

दो insertion functions लिखें, बहुत सरल, framework नीचे दिखाया गया है, इसमें कुछ बातें समझानी हैं, इस प्रकार:

  • state, benchmark की runtime state information है
  • उदाहरण के लिए: sleep control, input parameters control आदि
  • state.range(0) यानी 0th parameter लेना
  • DoNotOptimize यानी compiler optimization न करना
// 测试 std::vector 的插入速度
static void BM_vectorInsert(benchmark::State& state) {
    for (auto _ : state) {
        std::vector<int> v;
        for (size_t i = 0; i < state.range(0); ++i) {
            v.insert(v.begin() + i, i);
        }
        benchmark::DoNotOptimize(v);
    }
}

// 测试 std::list 的插入速度
static void BM_listInsert(benchmark::State& state) {
    for (auto _ : state) {
        std::list<int> l;
        for (size_t i = 0; i < state.range(0); ++i) {
            l.insert(l.begin(), i);
        }
        benchmark::DoNotOptimize(l);
    }
}

Main entry call:

  • Range(8, 8 << 10) का मतलब 8 से शुरू, हर बार 8 से गुणा, 8192 तक, यह ऊपर वाले state.range(0) से मेल खाता है, यह संख्या parameter के रूप में पास की जाती है
  • BENCHMARK_MAIN का मतलब google benchmark का main function उपयोग करना, हम जानते हैं हर executable फ़ाइल का एक main होता है, यह फ़ाइल इसलिए execute हो सकती है क्योंकि यह macro expand होकर main function बन जाता है, समझ आ गया?
// 定义基准测试
BENCHMARK(BM_vectorInsert)->Range(8, 8<<10);
BENCHMARK(BM_listInsert)->Range(8, 8<<10);

// 运行基准测试
BENCHMARK_MAIN();

3. सारांश

इस section में Step by Step सबको google benchmark सिखाया गया और उसे अपने project में लागू किया गया, आप इसमें कई दिलचस्प काम कर सकते हैं, इस section का source code 知识星球 में सीखने के लिए रखा गया है, join करके साथ exchange करने के लिए स्वागत है~

संबंधित विषय

टिप्पणियाँ