国外C++大佬分享:多年编码后发现的 8 个 C++ 性能技巧

256 阅读5分钟

图片创作不易,方便的话点点关注,谢谢

文章结尾有最新热度的文章,感兴趣的可以去看看。

本文是经过严格查阅相关权威文献和资料,形成的专业的可靠的内容。全文数据都有据可依,可回溯。特别申明:数据和资料已获得授权。本文内容,不涉及任何偏颇观点,用中立态度客观事实描述事情本身

文章有点长(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::stringgetName() const {
    return name;
}

添加 const 可以确保方法不会修改对象,从而向编译器表明这一意图,并实现进一步优化。这样可以避免复制整个字符串,而只需引用它即可。

提示:将对象传递给函数时,如果不需要修改对象,最好通过引用或常量引用传递。

3、利用移动语义

C++ 具有移动语义,可以帮助 u 将资源从一个对象转移到另一个对象。 例如

std::vector<intcreateVector() {
    std::vector<int> vec = {123};
    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++ 编程过程中不断摸索总结出来的。每个项目都是独一无二的,因此请务必考虑您应用程序的具体需求。

图片

点个“在看”不失联

最新热门文章推荐:

国外Rust程序员分享:Rust与C++的完美结合

国外C++程序员分享:2024/2025年C++是否还值得学习?

外国人眼中的贾扬清:从清华到阿里,再创业LeptonAI

白宫关注下,C++的内存安全未来走向何方?

国外Python程序员分享:如何用Python构建一个多代理AI应用

本地部署六款大模型:保护隐私、节省成本,特定环境首选

国外CUDA程序员分享:2024年GPU编程CUDA C++(从环境安装到进阶技巧)

我卸载了VSCode,我的生产力大幅提升

国外Python程序员分享:2024年NumPy高性能计算库(高级技巧)

外国人眼中的程明明:从“电脑小白”到CV领域领军者

外国人眼中的周志华:人工智能奖获得者、人工智能学院院长

国外C++程序员分享:C++多线程实战掌握图像处理高级技巧

外国人眼中的卢湖川:从大连理工到全球舞台,他的科研成果震撼世界!

外国人眼中的张祥雨:交大90后男神博士,3年看1800篇论文,还入选福布斯精英榜

参考文献:《图片来源网络》

本文使用 文章同步助手 同步