C 语言代码优化与性能调优:编译器优化、内存优化、算法优化与工具链配合
本文系统讲解了 C 语言代码优化与性能调优的关键技术。内容包括编译器优化选项的使用、内存管理技巧(避免泄漏与碎片)、常见算法的效率提升以及 gprof、perf 等工具链的配合。通过实战项目演示了如何综合运用上述方法提高程序执行效率与资源利用率。

本文系统讲解了 C 语言代码优化与性能调优的关键技术。内容包括编译器优化选项的使用、内存管理技巧(避免泄漏与碎片)、常见算法的效率提升以及 gprof、perf 等工具链的配合。通过实战项目演示了如何综合运用上述方法提高程序执行效率与资源利用率。

💡 代码优化与性能调优是 C 语言开发的进阶技能!通过优化和调优,你可以提高程序的执行效率,节省资源,提升用户体验。
无优化:
gcc -O0 main.c -o app
优化等级 1:
gcc -O1 main.c -o app
优化等级 2:
gcc -O2 main.c -o app
优化等级 3:
gcc -O3 main.c -o app
代码示例 1:编译器优化的对比
#include <stdio.h>
#include <time.h>
#define SIZE 1000000
int main() {
int arr[SIZE];
int sum = 0;
// 初始化数组
for (int i = 0; i < SIZE; i++) {
arr[i] = i;
}
// 求和
clock_t start = clock();
for (int i = 0; i < SIZE; i++) {
sum += arr[i];
}
clock_t end = clock();
printf("sum:%d\n", sum);
printf("运行时间:%f 秒\n", (double)(end - start) / CLOCKS_PER_SEC);
return 0;
}
编译和运行:
gcc -O0 -g main.c -o app_0
gcc -O1 -g main.c -o app_1
gcc -O2 -g main.c -o app_2
gcc -O3 -g main.c -o app_3
./app_0
sum: 499999500000
运行时间:0.000123 秒
./app_1
sum: 499999500000
运行时间:0.000056 秒
./app_2
sum: 499999500000
运行时间:0.000001 秒
./app_3
sum: 499999500000
运行时间:0.000001 秒
代码示例 2:避免内存泄漏
#include <stdio.h>
#include <stdlib.h>
int main() {
int* ptr = (int*)malloc(10 * sizeof(int));
if (ptr == NULL) {
printf("内存分配失败!\n");
return 0;
}
// 使用内存
for (int i = 0; i < 10; i++) {
ptr[i] = i;
}
// 释放内存
free(ptr);
ptr = NULL;
return 0;
}
代码示例 3:避免内存碎片
#include <stdio.h>
#include <stdlib.h>
#define SIZE 1000000
int main() {
int* ptr = (int*)malloc(SIZE * sizeof(int));
if (ptr == NULL) {
printf("内存分配失败!\n");
return 0;
}
// 使用内存
for (int i = 0; i < SIZE; i++) {
ptr[i] = i;
}
// 释放内存
free(ptr);
ptr = NULL;
return 0;
}
代码示例 4:优化数据结构
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SIZE 1000000
typedef struct {
int id;
char name[50];
float score;
} Student;
int main() {
Student* students = (Student*)malloc(SIZE * sizeof(Student));
if (students == NULL) {
printf("内存分配失败!\n");
return 0;
}
// 初始化数据
srand(time(NULL));
for (int i = 0; i < SIZE; i++) {
students[i].id = i;
sprintf(students[i].name, "学生%d", i);
students[i].score = rand() % 100;
}
// 求和
clock_t start = clock();
float total = 0;
for (int i = 0; i < SIZE; i++) {
total += students[i].score;
}
clock_t end = clock();
printf("平均成绩:%f\n", total / SIZE);
printf("运行时间:%f 秒\n", (double)(end - start) / CLOCKS_PER_SEC);
free(students);
students = ;
;
}
代码示例 5:排序算法优化
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SIZE 1000000
void quick_sort(int* arr, int left, int right) {
if (left < right) {
int pivot = arr[left];
int i = left, j = right;
while (i < j) {
while (i < j && arr[j] >= pivot) {
j--;
}
if (i < j) {
arr[i++] = arr[j];
}
while (i < j && arr[i] < pivot) {
i++;
}
if (i < j) {
arr[j--] = arr[i];
}
}
arr[i] = pivot;
quick_sort(arr, left, i - 1);
quick_sort(arr, i + 1, right);
}
}
int main() {
int* arr = (int*)malloc(SIZE * sizeof(int));
if (arr == NULL) {
printf("内存分配失败!\n");
return 0;
}
// 初始化数组
srand(time(NULL));
for (int i = 0; i < SIZE; i++) {
arr[i] = rand() % 1000;
}
// 排序
clock_t start = clock();
quick_sort(arr, , SIZE - );
end = clock();
(, ()(end - start) / CLOCKS_PER_SEC);
(arr);
arr = ;
;
}
代码示例 6:查找算法优化
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SIZE 1000000
int binary_search(int* arr, int size, int target) {
int left = 0, right = size - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (arr[mid] == target) {
return mid;
} else if (arr[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;
}
int main() {
int* arr = (int*)malloc(SIZE * sizeof(int));
if (arr == NULL) {
printf("内存分配失败!\n");
return 0;
}
// 初始化数组
for (int i = 0; i < SIZE; i++) {
arr[i] = i;
}
// 查找
int target = 500000;
clock_t start = clock();
index = binary_search(arr, SIZE, target);
end = clock();
(index != ) {
(, target, index);
} {
(, target);
}
(, ()(end - start) / CLOCKS_PER_SEC);
(arr);
arr = ;
;
}
代码示例 7:使用 gprof 进行性能分析
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SIZE 1000000
void quick_sort(int* arr, int left, int right) {
if (left < right) {
int pivot = arr[left];
int i = left, j = right;
while (i < j) {
while (i < j && arr[j] >= pivot) {
j--;
}
if (i < j) {
arr[i++] = arr[j];
}
while (i < j && arr[i] < pivot) {
i++;
}
if (i < j) {
arr[j--] = arr[i];
}
}
arr[i] = pivot;
quick_sort(arr, left, i - 1);
quick_sort(arr, i + 1, right);
}
}
int main() {
int* arr = (int*)malloc(SIZE * sizeof(int));
if (arr == NULL) {
printf("内存分配失败!\n");
return 0;
}
// 初始化数组
srand(time(NULL));
for (int i = 0; i < SIZE; i++) {
arr[i] = rand() % 1000;
}
// 排序
quick_sort(arr, , SIZE - );
(arr);
arr = ;
;
}
编译和运行:
gcc -O0 -pg main.c -o app
./app
gprof app
代码示例 8:使用 perf 进行性能分析
perf record ./app
perf report
代码示例 9:使用 valgrind 进行内存分析
valgrind --leak-check=yes --track-origins=yes ./app
项目结构:
myproject/
├── CMakeLists.txt
├── include/
│ └── utils.h
└── src/
├── main.c
└── utils.c
utils.h:
#ifndef UTILS_H
#define UTILS_H
void bubble_sort(int* arr, int size);
void quick_sort(int* arr, int left, int right);
#endif
utils.c:
#include "utils.h"
void bubble_sort(int* arr, int size) {
for (int i = 0; i < size - 1; i++) {
for (int j = 0; j < size - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
void quick_sort(int* arr, int left, int right) {
if (left < right) {
int pivot = arr[left];
int i = left, j = right;
while (i < j) {
while (i < j && arr[j] >= pivot) {
j--;
}
if (i < j) {
arr[i++] = arr[j];
}
while (i < j && arr[i] < pivot) {
i++;
}
if (i < j) {
arr[j--] = arr[i];
}
}
arr[i] = pivot;
quick_sort(arr, left, i - 1);
quick_sort(arr, i + 1, right);
}
}
main.c:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "utils.h"
#define SIZE 1000000
int main() {
int* arr = (int*)malloc(SIZE * sizeof(int));
if (arr == NULL) {
printf("内存分配失败!\n");
return 0;
}
// 初始化数组
srand(time(NULL));
for (int i = 0; i < SIZE; i++) {
arr[i] = rand() % 1000;
}
// 排序
clock_t start = clock();
quick_sort(arr, 0, SIZE - 1);
clock_t end = clock();
printf("运行时间:%f 秒\n", (double)(end - start) / CLOCKS_PER_SEC);
free(arr);
arr = NULL;
return 0;
}
CMakeLists.txt:
cmake_minimum_required(VERSION 3.10)
project(MyProject)
set(CMAKE_C_STANDARD 11)
include_directories(include)
set(SRCS src/main.c src/utils.c)
add_executable(app ${SRCS})
# 编译器优化
target_compile_options(app PRIVATE -O2 -g)
# 安装目标
install(TARGETS app RUNTIME DESTINATION bin)
性能分析:
mkdir build
cd build
cmake ..
make
./app
perf record ./app
perf report
✅ 编译器优化:利用 gcc 的优化选项,自动优化代码,提高程序的执行效率 ✅ 内存优化:通过优化内存使用,避免内存泄漏和内存碎片,提高程序的执行效率 ✅ 算法优化:通过优化算法,提高程序的执行效率,如排序算法、查找算法、遍历算法 ✅ 工具链配合:使用编译器、调试器、代码检查工具和性能分析工具进行性能调优 ✅ 实战案例分析:使用优化技术和工具链调优项目,实现排序算法的性能提升

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML 转 Markdown 互为补充。 在线工具,Markdown 转 HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML 转 Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online