创作不易,方便的话点点关注,谢谢
文章结尾有最新热度的文章,感兴趣的可以去看看。
本文是经过严格查阅相关权威文献和资料,形成的专业的可靠的内容。全文数据都有据可依,可回溯。特别申明:数据和资料已获得授权。本文内容,不涉及任何偏颇观点,用中立态度客观事实描述事情本身
文章有点长(1500字阅读时长:5分),期望您能坚持看完,并有所收获。
大家好我想与大家分享这些 C++ 性能技巧,我觉得每个人都应该了解它们,因为我花了很多精力和错误才学会了它们。因此,这里有八个性能提示,它们在我的项目中发挥了真正的作用。
1、 使用高效的数据结构
选择正确的数据结构会带来天壤之别。例如,如果你需要快速插入和删除,std::list 似乎很有吸引力。但是,由于缓存丢失和开销,它可能不是最佳选择。 而不是
std::list<int> numbers;
考虑使用
std::vector<int> numbers;
除非你特别需要链接列表的属性,否则 std::vector 通常会因为更好的内存定位而更快。
个人感言:有一次,我在热循环中用 std::vector 替换了 std::list,结果性能有了显著提高。这让我学会了经常质疑自己的默认选择。
2、避免不必要的复制
复制大型对象的代价可能很高。注意函数参数和返回类型。 而不是
std::string getName() {
return name;
}
尽可能使用参考文献:
const std::string& getName() const {
return name;
}
添加 const 可以确保方法不会修改对象,从而向编译器表明这一意图,并实现进一步优化。这样可以避免复制整个字符串,而只需引用它即可。
提示:将对象传递给函数时,如果不需要修改对象,最好通过引用或常量引用传递。
3、利用移动语义
C++ 具有移动语义,可以帮助 u 将资源从一个对象转移到另一个对象。 例如
std::vector<int> createVector() {
std::vector<int> vec = {1, 2, 3};
return vec; // Moves rather than copies
}
编译器将使用移动语义将 vec 传输给调用者,而不会复制。
实现:当我开始使用移动语义时,我发现我的程序变得更高效了,尤其是在处理大型数据结构时。
4、谨慎分配内存
频繁的分配和取消分配会减慢程序的运行速度。尽量减少性能关键部分的动态内存使用量。 而不是
for (int i = 0; i < 1000; ++i) {
int* num = new int(i);
// ... use num ...
delete num;
}
预先分配内存:
std::vector<int> nums;
nums.reserve(1000);
for (int i = 0; i < 1000; ++i) {
nums.push_back(i);
}
5、优先选择前缀增量而不是后缀
迭代时,对于某些迭代器,使用前缀递增操作符可能更有效。 而不是
for (auto it = container.begin(); it != container.end(); it++) {
// ...
}
使用:
for (auto it = container.begin(); it != container.end(); ++it) {
// ...
}
后缀递增 (it++) 在递增之前会创建一个迭代器副本,这可能会造成不必要的开销。
观察:这看似微不足道,但在紧密的循环中,这一细微的变化会产生明显的影响。
6、内联小功能
对于频繁调用的小函数,内联可以减少函数调用开销。 例如
inline int add(int a, int b) {
return a + b;
}
注意:现代编译器的内联能力很强,但显式内联可以给编译器一个提示。 经验我有一个数学繁重的应用程序,在不影响代码清晰度的情况下,内联小函数提高了性能。
7、 使用适当的算法
有时,更高效的算法可以超越任何代码级优化。 而不是低效分类:
// Bubble sort implementation
void bubbleSort(std::vector<int>& arr) {
// ...
}
使用标准库
std::sort(arr.begin(), arr.end());
标准库中的算法经过了高度优化。 提醒:我曾经花了好几天优化一个自定义排序函数,后来才发现 std::sort 更快、更可靠。
8、 编写代码简介
没有测量就无法优化。剖析可帮助您找出瓶颈。 使用剖析器: Visual Studio Profiler gprof(GNU 剖析器) Instruments (on macOS)
如何使用 gprof: 在启用剖析功能的情况下编译程序
g++ -pg -o myprogram myprogram.cpp
运行程序
./myprogram
生成剖析报告:
gprof myprogram gmon.out > report.txt
轶事:剖析发现,一个我认为无关紧要的函数消耗了 40% 的执行时间。对它进行优化后,我的应用程序速度大幅提升。
总结
这些技巧都是我在 C++ 编程过程中不断摸索总结出来的。每个项目都是独一无二的,因此请务必考虑您应用程序的具体需求。
点个“在看”不失联
最新热门文章推荐:
国外C++程序员分享:2024/2025年C++是否还值得学习?
国外Python程序员分享:如何用Python构建一个多代理AI应用
国外CUDA程序员分享:2024年GPU编程CUDA C++(从环境安装到进阶技巧)
国外Python程序员分享:2024年NumPy高性能计算库(高级技巧)
外国人眼中的卢湖川:从大连理工到全球舞台,他的科研成果震撼世界!
外国人眼中的张祥雨:交大90后男神博士,3年看1800篇论文,还入选福布斯精英榜
参考文献:《图片来源网络》
本文使用 文章同步助手 同步