การวัดประสิทธิภาพระดับย่อยด้วย 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- โครงสร้างข้อมูลที่เป็นมิตรต่อแคช
- การทำนายการแยกแขนงและลูปร้อน
- การทำโปรไฟล์ด้วย perf vtune และ Sanitizers
- การวัดประสิทธิภาพระดับย่อยด้วย Google Benchmark