性能分析备忘录
Perf Debian 安装 perf 1 sudo apt install linux-perf 收集分支预测事件 1 perf stat -e branch-instructions,branch-misses <your_program> branch-instructions:分支指令的总数 branch-misses:分支预测失败的次数 1 hit_rate = 1 - branch-misses / branch-instructions //命中率 以下是一个包含多个复杂分支跳转的 C 语言程序示例。这个程序包含了多层嵌套的条件判断、循环和函数调用,以演示复杂的分支逻辑 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 #include <stdio.h> #include <stdlib.h> #include <time.h> // 模拟复杂条件的函数 int complex_condition(int x) { if (x % 2 == 0) { if (x % 3 == 0) { return 1; // 可被2和3整除 } else { if (x % 5 == 0) { return 2; // 可被2和5整除 } else { return 3; // 可被2整除,但不能被3或5整除 } } } else { if (x % 7 == 0) { return 4; // 可被7整除 } else { return 5; // 不能被2或7整除 } } } // 递归函数,模拟复杂的分支跳转 int recursive_function(int depth) { if (depth <= 0) { return 0; } else { if (depth % 2 == 0) { return depth * recursive_function(depth - 1); } else { return depth + recursive_function(depth - 1); } } } // 主函数,包含多重循环和分支判断 int main() { srand(time(NULL)); // 用当前时间作为随机数种子 // 模拟分支跳转 for (int i = 0; i < 20; i++) { int rand_num = rand() % 100 + 1; // 生成1到100之间的随机数 int result = complex_condition(rand_num); switch (result) { case 1: printf("Number %d is divisible by 2 and 3.\n", rand_num); break; case 2: printf("Number %d is divisible by 2 and 5.\n", rand_num); break; case 3: printf("Number %d is divisible by 2, but not by 3 or 5.\n", rand_num); break; case 4: printf("Number %d is divisible by 7.\n", rand_num); break; case 5: printf("Number %d is not divisible by 2 or 7.\n", rand_num); break; default: printf("Unexpected result for number %d.\n", rand_num); break; } } // 递归调用,模拟更复杂的分支 int depth = rand() % 10 + 1; printf("\nRecursive function result for depth %d: %d\n", depth, recursive_function(depth)); return 0; } 编译之后,使用 perf 进行分支预测事件统计得到结果: ...