学逆向论坛

找回密码
立即注册

只需一步,快速开始

发新帖

489

积分

0

好友

60

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

1.明智地使用智能指针
在C++中管理内存可能相当棘手。像std::unique_ptrstd::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.如果您喜欢这篇帖子,请给作者点赞评分,点赞会增加帖子的热度,评分会给作者加学币。(评分不会扣掉您的积分,系统每天都会重置您的评分额度)。
2.回复帖子不仅是对作者的认可,还可以获得学币奖励,请尊重他人的劳动成果,拒绝做伸手党!
3.发广告、灌水回复等违规行为一经发现直接禁言,如果本帖内容涉嫌违规,请点击论坛底部的举报反馈按钮,也可以在【投诉建议】板块发帖举报。

小黑屋|手机版|站务邮箱|学逆向论坛 ( 粤ICP备2021023307号 )|网站地图

GMT+8, 2025-2-21 22:25 , Processed in 0.203052 second(s), 34 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表