在C ++中优化性能优化的想法
好的,在过去的三天里,我一直坐在profiler结果前面,通过一个自动化套件运行相当广泛的测试用例。 这个想法是看看是否有任何可以提高性能的优化优化。 我将在这方面具备以下条件:
绩效改进的潜力在终端用户水平上都非常显着且可观察到,例如,表现不佳的地区的绩效改善> 100%。
减少核心空间使用的潜力,例如数据大量减少> 50%。
易于实现,对代码的混淆最少,副作用最小。 即实施优化的好处大大超出了成本。
该应用程序是一个3D映射和建模软件包,在界面中有大量的图形和后端的几何处理。 我已经在确保大多数处理的最佳算法选择方面做了很多工作,在这个阶段,我正在寻找任何通用的简单方法,以便在处理大型和复杂数据集时获得额外的优势。 到目前为止,我已经提出了以下内容。
搜索时,保留最近找到的最近的项目的缓冲区,并首先检查。 大量处理与重复搜索似乎搜索同一地区。 从迄今为止的答案来看,这似乎是一种特殊的记忆形式
排序时,请检查数据是否已经按照排序顺序排列(特别是使用了qsort的地方)
保持图形用户界面和处理单独的线程(失败的好标准易于实现,但国际海事组织仍然值得)
如果你有本地类变量,那些构造/销毁时间很长的成员函数,那么使它们成为私有类成员。 值得注意的是动态数组和字符串,特别是MFC CArrays和CStrings。
使用动态数组时,请将初始大小设置为略微超出典型使用率,并采用指数增长策略。
处理要存储在数组中的非常大的数据集时,请首先调整数据大小以避免重新分配。
避免函数返回在堆栈上创建临时对象副本,请使用引用参数,例如
CString MyFunc(double x,double y)
效率低于
void MyFunc(double x, double y, CString &Result)
实际上,避免CStrings和大多数MFC在代码的任何性能关键领域。 (编辑:这可能会更一般地被RVO否定,但不适用于我的应用中的CStrings)
这些东西似乎在我的环境中运行良好,但是有没有明显的东西我遗漏了,还是还有其他优化资源吗?
编辑:根据提供的许多评论,显然需要进一步的解释。 尽管我完全认识到,针对某个特定代码提出具体优化需要查看该代码,但在分析探查器输出的过去几天中,已经显示出优化候选者的某些模式。 我也意识到我自己对于其他人在该领域的良好效果所做的无知,并且看到了(至少对我而言)列举这些技术的价值(无论它们是否适用于我的情况)。 这个问题不是关于优化的危害,但对于那些初学者来说,我建议你首先建立一个强大的需求,以便在首先考虑之前进行优化。 我自己的偏好是在设计阶段根据性能要求进行最优化,但我也是一个强大的倡导者,用于验证设计假设在实现中已经得到满足。 我会请人们将他们的答案限制在他们自己积极优化的体验上,而不是他们的信念,即我们是否应该首先考虑优化。
FWIW,编译器优化代码的差异在我的自动化套件中为12%,这在最终用户级别是可以观察到的。
第二次编辑:我发现一些相关的帖子非常有用,特别是Mike Dunlavey关于过于依赖Profiler输出的评论。
性能优化策略的最后手段?
我可以用什么来分析Linux中的C ++代码?
CString MyFunc(double x, double y)
效率低于
void MyFunc(double x, double y, CString &Result)
如果MyFunc写得干干净净,他们应该差不多。 编译器应该能够利用NRVO。 这听起来像你已经分析并发现它不是 - 我只是说它可能更符合你的标准,例如“对代码的最小混淆”,重新排列函数本身以允许NRVO发生。
还有几件事要尝试:
Sorted<T>
),使得这些假设是明确的。 这样,如果你有一个方法需要一个Sorted<vector<T> >
,例如,你给它一个排序向量,它会直接通过 - 但如果你给它一个vector<T>
,它将不得不构建一个Sorted<vector<T> >
,在这一点上它将对它进行排序。 你可以手动声明它是使用另一个构造函数进行排序的,但它可以让你更容易地进行假设,也可以捕获你可能错过的地方。 请不要抛弃任何旧的“优化是万恶之源”的东西,这对于这个问题来说是完全不相干的
是的,然后你有这样的事情:
排序时,请检查数据是否已按排序顺序排列
让我怀疑你是否在使用高效的算法。 这是“过早优化是万恶之源”的基本前提。
并会被降低。
真? 这种语气并不好。 IMO。 因人而异。
同样,我对让编译器为我优化它或在整个地方抛出内联的乐趣不感兴趣。 FWIW,编译器优化代码的差异在我的自动化套件中为12%,这在最终用户级别是可以观察到的。
再加上你手工仪器的优化,你仍然希望编译器优化。
除此之外,由于您对瓶颈的位置没有提供特别的见解,所以提供任何指针都很困难甚至不可能。 我至少会猜测你至少:
编辑:既然你说你不知道RVO:尝试阅读移动语义,尤其是这个库:从Adobe move
库。 我猜Boost会有类似的东西。
编辑#2:还有两件事:
我认为你的要求几乎是相互排斥的,除非有某种明显的缺陷(这是所有分析对找到真的很好)。
真正改变性能的东西需要付出很多努力,而基本的数据结构是最重要的。 减少内存碎片,对齐的内存管理,SIMD,尽可能小的数据结构并尽可能多地分配到一个块中,多线程,从模板中减少代码大小,将参数重新声明为局部变量,以便优化器可以知道它们是相同的进行优化。 没有很多成本,这些都不能在最后加上。
很多时候,你甚至无法轻松测量真正影响性能的事情,因为程序运行或随着代码大小的增长而变得昂贵。
链接地址: http://www.djcxy.com/p/6733.html