0Pricing
C++ Academy · บทเรียน

การวัดประสิทธิภาพระดับย่อยด้วย Google Benchmark

เขียนการทดสอบประสิทธิภาพระดับย่อยที่เชื่อถือได้ด้วย Google Benchmark และหลีกเลี่ยงข้อผิดพลาดในการวัด

การวัดประสิทธิภาพระดับย่อยด้วย Google Benchmark เป็นบทเรียน C++ Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C++ Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน

เหตุใดจึงต้องทำไมโครเบนช์มาร์ก

การทำโปรไฟล์ระดับภาพรวมแสดงว่าใช้เวลาไปกับส่วนใด ส่วนไมโครเบนช์มาร์กจะวัดโค้ดเฉพาะส่วนแบบแยกเดี่ยว ซึ่งมีประโยชน์สำหรับเปรียบเทียบอัลกอริทึมหรือการนำไปใช้งาน

การตั้งค่า Google Benchmark

ไลบรารีเบนช์มาร์ก C++ ที่เกือบทั้งหมดอยู่ในไฟล์ส่วนหัวของ Google ติดตั้งผ่าน vcpkg, Conan หรือ apt แล้วลิงก์ด้วย -lbenchmark

#include <benchmark/benchmark.h>

static void BM_StringCopy(benchmark::State& state) {
    std::string s = "Hello, World!";
    for (auto _ : state) {
        std::string copy(s);
    }
}
BENCHMARK(BM_StringCopy);
BENCHMARK_MAIN();

การคอมไพล์และการรัน

คอมไพล์พร้อมการปรับให้เหมาะสม ลิงก์กับไลบรารีเบนช์มาร์ก แล้วจึงรัน

g++ -O2 -DNDEBUG bench.cpp -lbenchmark -lpthread -o bench
./bench

การตีความผลลัพธ์

ไลบรารีจะแสดงเวลาต่อการวนหนึ่งรอบ จำนวนรอบ และเวลา CPU เปรียบเทียบค่าพื้นฐานกับการเปลี่ยนแปลงที่เสนอ

การหลีกเลี่ยงลูกเล่นของตัวปรับให้เหมาะสม

ตัวปรับให้เหมาะสมอาจลบโค้ดที่ไม่มีประโยชน์ทิ้ง ใช้ benchmark::DoNotOptimize เพื่อบังคับให้ผลลัพธ์ “มีความสำคัญ”

for (auto _ : state) {
    auto result = expensive_function();
    benchmark::DoNotOptimize(result);
}

การป้องกันการเขียนที่ไม่มีผล

benchmark::ClobberMemory บอกคอมไพเลอร์ว่าสถานะหน่วยความจำถูกสังเกตแล้ว จึงป้องกันการลบการเขียนออก

เบนช์มาร์กแบบมีพารามิเตอร์

ทดสอบฟังก์ชันเดียวกันกับขนาดข้อมูลนำเข้าที่แตกต่างกัน

static void BM_Sort(benchmark::State& state) {
    std::vector<int> v(state.range(0));
    std::iota(v.rbegin(), v.rend(), 0);
    for (auto _ : state) {
        auto copy = v;
        std::sort(copy.begin(), copy.end());
    }
}
BENCHMARK(BM_Sort)->RangeMultiplier(2)->Range(8, 1<<14);

เบนช์มาร์กแบบหลายเธรด

ทดสอบความสามารถในการขยายขนาดด้วยตัวปรับแต่ง Threads

BENCHMARK(BM_ConcurrentMap)->Threads(1)->Threads(4)->Threads(16);

ตัวนับแบบกำหนดเอง

ติดตามเมตริกเฉพาะโดเมน เช่น ไบต์ต่อวินาที หรือรายการต่อวินาที

state.SetItemsProcessed(state.iterations() * input.size());
state.SetBytesProcessed(state.iterations() * input.size() * sizeof(int));

ผลลัพธ์ทางสถิติ

รันด้วย --benchmark_repetitions=10 เพื่อรับค่าเฉลี่ย มัธยฐาน และส่วนเบี่ยงเบนมาตรฐาน ไลบรารีจะรายงานค่าเหล่านี้โดยอัตโนมัติ

ข้อผิดพลาดที่พบบ่อย

โปรดระวัง:

  • คอมไพเลอร์ลบโค้ดที่ “ไม่มีการใช้งาน” ออก → ใช้ DoNotOptimize
  • ผลจากการอุ่นเครื่อง → วัดผลหลายรอบ
  • ความถี่ CPU ปรับเปลี่ยนขึ้นลง → ผูกงานไว้กับคอร์และปิดการเร่งความถี่
  • มีโพรเซสอื่นทำงานอยู่ → ทำเบนช์มาร์กบนเครื่องที่ไม่มีงานรบกวน

การอ่านตัวเลขอย่างมีวิจารณญาณ

การปรับปรุง 5% อาจเป็นเพียงสัญญาณรบกวนจากการวัด รันซ้ำหลายครั้ง และเชื่อถือเฉพาะความแตกต่างที่มีนัยสำคัญทางสถิติ เปรียบเทียบกับค่าพื้นฐานที่ทราบแน่ชัด

ทางเลือกอื่น

เครื่องมือไมโครเบนช์มาร์กอื่น ๆ:

  • Nonius — เบนช์มาร์ก C++ ที่อยู่ในไฟล์ส่วนหัว
  • Hayai — เก่ากว่าแต่มีน้ำหนักเบา
  • Catch2 มีการรองรับเบนช์มาร์กในตัว

ตรวจสอบความเข้าใจ

เหตุใดจึงใช้ benchmark::DoNotOptimize(result) ภายในลูปเบนช์มาร์ก

สรุป

ใช้ Google Benchmark สำหรับการวัดแบบละเอียด ป้องกันลูกเล่นของคอมไพเลอร์ด้วย DoNotOptimize และ ClobberMemory ใช้เบนช์มาร์กแบบมีพารามิเตอร์และแบบหลายเธรดเพื่อสำรวจพฤติกรรมกับข้อมูลนำเข้าและการทำงานพร้อมกันที่แตกต่างกัน เชื่อถือเฉพาะความแตกต่างที่มีนัยสำคัญทางสถิติ

คำถามที่พบบ่อย

บทเรียน “การวัดประสิทธิภาพระดับย่อยด้วย Google Benchmark” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การวัดประสิทธิภาพระดับย่อยด้วย Google Benchmark” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C++ Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การวัดประสิทธิภาพระดับย่อยด้วย Google Benchmark”

เขียนการทดสอบประสิทธิภาพระดับย่อยที่เชื่อถือได้ด้วย Google Benchmark และหลีกเลี่ยงข้อผิดพลาดในการวัด คุณปฏิบัติ C++ Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C++ Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C++ Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “การวัดประสิทธิภาพระดับย่อยด้วย Google Benchmark” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C++ Academy นี้ได้ไหม

ได้ บทเรียน C++ Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. โครงสร้างข้อมูลที่เป็นมิตรต่อแคช
  2. การทำนายการแยกแขนงและลูปร้อน
  3. การทำโปรไฟล์ด้วย perf vtune และ Sanitizers
  4. การวัดประสิทธิภาพระดับย่อยด้วย Google Benchmark
← กลับไปที่ C++ Academy