Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C++;_C++_Optimization - Fatal编程技术网

C++ 在C++;

C++ 在C++;,c++,optimization,C++,Optimization,好的,在过去的三天里,我一直坐在探查器结果的前面,这些结果是通过自动化套件运行相当广泛的测试用例生成的。我们的想法是,看看是否有任何良好的优化,通常可以提高性能。在这种情况下,我将对good进行以下限定: 具有潜在的性能 这两项改进都非常重要 在结尾处显著且可观察到 用户级别,例如>100%的改进 在表现不佳的领域 具有核心空间的潜力 使用量减少,例如减少50%以上 在数据密集的区域 易于实现,成本最低 对代码进行模糊处理,并最小化 副作用。i、 e.可持续发展的好处 大幅度实施优化 超过成本

好的,在过去的三天里,我一直坐在探查器结果的前面,这些结果是通过自动化套件运行相当广泛的测试用例生成的。我们的想法是,看看是否有任何良好的优化,通常可以提高性能。在这种情况下,我将对good进行以下限定:

  • 具有潜在的性能 这两项改进都非常重要 在结尾处显著且可观察到 用户级别,例如>100%的改进 在表现不佳的领域

  • 具有核心空间的潜力 使用量减少,例如减少50%以上 在数据密集的区域

  • 易于实现,成本最低 对代码进行模糊处理,并最小化 副作用。i、 e.可持续发展的好处 大幅度实施优化 超过成本

该应用程序是一个3d映射和建模软件包,界面上有大量图形,后端有几何处理。我已经在确保大多数处理的最佳算法选择方面做了很多工作,在这个阶段,我正在寻找任何普遍适用的简单方法,以便在处理大型复杂数据集时获得额外的冲力。到目前为止,我已经得出以下结论:

  • 搜索时,保留最近找到的项目的缓冲区,并首先检查。大量重复搜索的处理似乎都在同一个区域内搜索。从迄今为止的答案来看,这似乎是一种特殊形式的

  • 排序时,检查数据是否尚未按排序顺序排序(特别是在使用qsort的情况下)

  • 将GUI和处理保持在单独的线程中(不符合易于实现的良好标准,但IMO仍然值得)

  • 在频繁使用的成员函数中,如果存在具有大量构造/销毁时间的局部类变量,则将其设为私有类成员。尤其是动态数组和字符串,尤其是MFC CArrays和cstring

  • 使用动态数组时,将初始大小设置为略大于典型用法,并采用指数增长策略

  • 在处理存储在数组中的非常大的数据集时,请首先调整数据的大小,以避免任何realloc

  • 避免在堆栈上创建临时对象副本的函数返回,而是使用引用参数,例如

    CString MyFunc(双x,双y)

效率不如

void  MyFunc(double x, double y, CString &Result)
实际上,在代码的任何性能关键区域都要避免CString和大多数MFC。(编辑:虽然我的应用程序中没有CString,但这可能更普遍地被否定)

这些项目在我的环境中似乎工作得很好,但我是否遗漏了任何明显的项目,或者是否有其他关于优化的好资源

编辑:根据提供的许多评论,显然需要进一步解释。虽然我完全意识到,建议对特定代码段进行特定优化需要查看该代码,但在过去几天中,分析分析器输出的时间显示了优化候选项的某些模式。我也意识到我自己对其他人在该领域所做的有益的事情一无所知,我认为(至少对我来说)列举这些技术的价值,不管它们是否适用于我的情况。这个问题不是关于优化的危险性,但是对于任何初学者来说,我建议您在考虑优化之前,首先建立一个强烈的需求。我个人的偏好是在设计阶段根据未来的性能需求进行大多数优化,但我还是一个坚定的支持者,主张通过分析来验证设计假设在实现中是否得到了满足。我想请人们把他们的答案限制在他们自己的积极优化经验上,而不是他们自己的信念上 我们是否应该首先考虑优化?

FWIW,在我的自动化套件中,让编译器优化代码与不优化代码之间的差异达到12%,这在最终用户级别上是可以观察到的

第二次编辑:我发现一些相关帖子非常有益,特别是迈克·邓拉维(Mike Dunlavey)关于变得过于依赖分析器输出的评论


如果您在采样探查器下运行代码,发现有任何计算密集型例程占用大量时间,则可能会考虑许多微优化,如果您能够将支持限制在特定CPU上,则可以考虑使用SIMD.

我认为您的需求几乎是相互排斥的,除非存在某种明显的缺陷(这是所有分析都非常有利于发现的)

真正改变性能的事情需要很多努力,而您的基本数据结构是最重要的。减少内存框架、对齐内存管理、SIMD、尽可能小并在一个块中尽可能多地分配的数据结构、多线程、减少模板中的代码大小、将参数重新声明为局部变量,以便优化器知道它们是相同的,以便进行优化。所有这些都不可能在最后不花很多钱就完成

很多时候,您甚至无法轻松衡量真正影响性能的因素,因为它们只会随着程序运行或代码大小的增长而变得昂贵

请不要吐任何旧的 “优化是万恶之源” 诸如此类,这完全与此无关 问题:

是的,然后你会有这样的事情:

排序时,检查数据是否尚未按排序顺序排列

让我怀疑你是否使用了一个有效的算法。这是“过早优化是万恶之源”状态的基本前提

<