jinchanchan 发表于 6 天前

我用 C++ 编码多年后发现的8个C++性能技巧

嘿,大家好!在使用C++多年之后,我觉得应该分享一些性能方面的小窍门,它们在很多情况下都帮了我的大忙。以下就是实实在在提升了我各个项目性能的八点建议。别忘了收藏这篇文章哦——你可能会需要回顾一下这些内容呢!

1.明智地使用智能指针
在C++中管理内存可能相当棘手。像std::unique_ptr和std::shared_ptr这样的指针非常有用,但是过度使用std::shared_ptr可能会因引用计数而产生额外开销。
不要这样做:
std::shared_ptr<MyClass> ptr(new MyClass());试试这样:
auto ptr = std::make_unique<MyClass>();我记得在一个项目中,当我把一些shared_ptr替换成unique_ptr的时候——就好像我的应用程序深吸了一口气然后放松下来了一样。
**突发奇想:**有时候我会想,C++这门语言是不是设计来让我们保持谦逊的呀。正当你觉得自己已经搞懂它的时候,砰——就出现未定义行为了。

2.利用移动语
义尽量减少复制 复制大型对象是一种隐蔽的性能杀手。在C++11及之后的版本中,移动语义可以通过“移动”资源来帮助你避免不必要的复制。
不要这样做:
std::vector<MyClass> vec;vec.push_back(someLargeObject); // 复制对象试试这样:
std::vector<MyClass> vec;vec.push_back(std::move(someLargeObject)); // 移动对象我以前一直没重视移动语义,直到我意识到我的程序慢得像蜗牛爬坡一样。采用std::move后,情况就大为改观了。

3.为vector预留内存
如果你知道std::vector中大概需要多少元素,提前预留内存可以通过减少重新分配内存的次数来节省时间。
不要这样做:
std::vector<int> data;for (int i = 0; i < n; ++i) {    data.push_back(i);}试试这样:
std::vector<int> data;data.reserve(n);for (int i = 0; i < n; ++i) {    data.push_back(i);}


4.优先使用前缀自增而非后缀自增 当使用迭代器或简单的计数器时,使用前缀自增(++i)可能会比后缀自增(i++)稍微更高效一些,特别是对于复杂的迭代器类型来说。
不要这样做:
for (auto it = container.begin(); it!= container.end(); it++) {    // 执行某些操作}试试这样:
for (auto it = container.begin(); it!= container.end(); ++it) {    // 执行某些操作}这可能看起来有点吹毛求疵,但在紧密的循环中,每一微秒都很重要。

5.在不必要时避免使用虚函数 虚函数会因动态分派而增加开销。如果你不需要多态行为,就别用virtual关键字了。
不要这样做:
class Base {public:    virtual void doSomething();};试试这样:
class Base {public:    void doSomething();};我曾经把我所有类的方法都加上virtual关键字“以防万一”——大错特错啊。我的程序性能一落千丈。

6.谨慎使用异常处理 异常功能很强大,但如果过度使用可能成本很高,特别是在对性能要求苛刻的代码中。要明智地使用它们。
不要这样做:
try {    // 可能抛出异常的代码} catch (const std::exception& e) {    // 处理异常}如果合适的话,可以考虑采用其他错误处理方式。
我可是吃了大亏才明白这个道理的,当时我的实时应用程序就因为过度的异常处理开始出现卡顿了。

**突发奇想:**有时候我真希望生活也有个try-catch块呢。忘了带钥匙?捕获那个异常然后继续前行呀!
7.利用编译时多态 模板和内联函数可以帮助你实现多态,同时又不会有虚函数带来的运行时开销。
示例:
template <typename T>void process(T& obj) {    obj.doSomething();}这样可以利用编译器来生成代码,从而降低运行时成本。

8.在优化之前先进行性能分析 这虽然不是一个直接的编码技巧,但却至关重要。在做出更改之前,使用性能分析工具来确定瓶颈所在。
可用的工具比如:

[*]gprof
[*]Valgrind
[*]Visual Studio Profiler
我都数不清有多少次自己瞎猜性能问题出在哪儿,结果完全猜错了。性能分析可是能节省时间,还能让你保持清醒理智呢。
突发奇想:这就好比去看医生——你可能觉得自己知道哪儿出问题了,但诊断结果才会告诉你真实情况呀。
这些就是我在多年C++编程生涯中学到的一些经验教训。每个项目都是独一无二的,所以要相应地进行合理设计。

<顺便吆喝一句,民族企业大厂,前后端测试捞人,感兴趣的来!→https://jsj.top/f/o38ijj>

页: [1]
查看完整版本: 我用 C++ 编码多年后发现的8个C++性能技巧