073-提高c++运行效率的操作
C++ 提高运行效率的常见优化方法包括以下几类:
1. 数据结构优化
- 选择合适的数据结构:根据具体应用选择
std::vector
、std::deque
、std::list
、std::unordered_map
等。- 例如,
std::vector
由于数据局部性好,通常比std::list
更快(适用于频繁遍历的场景)。 std::unordered_map
适用于快速查找,而std::map
适用于有序存储。
- 例如,
- **使用
std::bitset
代替std::vector<bool>
**(你已经在用std::bitset
)。 - 避免不必要的动态内存分配:可以使用
std::array
或std::vector::reserve()
预分配空间。
2. 算法优化
- 减少不必要的计算:避免重复计算中间值,使用缓存(如
std::unordered_map
进行记忆化)。 - **使用
std::sort()
而非qsort()
**:C++ 的std::sort()
采用 introsort,比 C 语言的qsort()
更快。 - 使用合适的搜索和排序算法:如二分查找 (
std::lower_bound
)、快速排序、堆排序 (std::priority_queue
)。
3. 减少拷贝,提高内存管理效率
- 使用
std::move
和std::forward
避免不必要的拷贝:1
2
3std::string foo() {
return "Hello"; // 返回值优化(RVO),避免拷贝
} - **使用
std::unique_ptr
或std::shared_ptr
**,避免手动new/delete
。 - 使用
emplace_back
代替push_back
避免额外拷贝:1
2std::vector<std::string> vec;
vec.emplace_back("hello"); // 直接构造,避免额外的拷贝
4. 减少锁的争用
- 使用
std::atomic
代替锁(适用于简单的数据同步)。 - **使用
std::shared_mutex
**,在读多写少的情况下,减少锁的开销。 - 缩小锁的粒度:尽量减少锁的持有时间,你已经考虑在
VxiSession::ProcessData
里用swap
来减少锁的影响。
5. 提高 CPU 缓存命中率
- 尽量使用连续存储的容器(如
std::vector
),避免std::list
造成的缓存不友好情况。 - 减少指针跳转,如避免
std::list<std::shared_ptr<T>>
这样的嵌套结构。 - 使用
restrict
(仅 C++20 的__restrict__
关键字) 提示编译器优化指针别名分析。
6. 编译优化
- 使用
-O2
或-O3
进行编译优化(g++ -O3
)。 - **启用
-march=native
**,让编译器生成针对本地 CPU 的优化指令。 - 启用 LTO(链接时优化):
1
g++ -O3 -flto -march=native
- 使用
constexpr
让编译期计算结果:1
2
3
4constexpr int factorial(int n) {
return (n <= 1) ? 1 : (n * factorial(n - 1));
}
constexpr int result = factorial(5); // 5! 在编译期计算
7. 多线程优化
- 避免 false sharing(伪共享):在多线程中,多个线程修改同一个缓存行可能导致性能下降,可以使用
alignas(64)
让数据对齐。1
2
3struct alignas(64) Data {
int value;
};
8. 内存管理优化
- 减少
new/delete
调用:可以使用对象池(如boost::pool
)。 - 使用
std::vector::reserve()
预分配内存:1
2std::vector<int> v;
v.reserve(1000); // 预分配 1000 个元素,避免频繁扩容 - 使用
std::string_view
代替std::string
进行字符串处理,避免拷贝:1
2
3
4void print(std::string_view str) {
std::cout << str << '\n';
}
print("Hello, world"); // 不会创建新的字符串对象
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Hymns!