1
5
如果myfunc写得很干净,它们应该差不多。编译器应该能够利用 NRVO . 听起来你已经分析过了,发现它不是——我只是说它可能更符合你的标准,比如“代码的最小模糊度”,重新排列函数本身,让nrvo发生。 还有几件事要尝试:
|
2
9
是的,然后你就有了:
我想知道你是否在使用一种有效的算法。这是“过早优化是万恶之源”状态的基本前提。
真正地?那口气不好。IMO。
再加上手工工具的任何优化,您仍然需要编译器优化。 除此之外,由于您没有提供关于瓶颈所在位置的特定见解,因此很难(如果不可能)提供任何指针。我敢猜测你至少:
编辑:既然您说您不知道rvo:请尝试阅读移动语义,尤其是这个库:
编辑2:还有两件事:
|
3
3
我认为你的需求几乎是互斥的,除非有某种明显的缺陷(所有的分析都是很好的发现)。 真正改变性能的事情需要付出很多努力,而您的基本数据结构是最重要的。减少内存碎片、对齐内存管理、SIMD、尽可能小并尽可能多地分配在一个块中的数据结构、多线程、减少模板中的代码大小、将参数重新定义为局部变量,以便优化器知道它们是相同的,以进行优化。没有一个可以在没有大量成本的情况下在结尾处附加。 很多时候,你甚至不能很容易地测量那些真正影响性能的因素,因为它们只会随着程序的运行或代码大小的增长而变得昂贵。 |
4
3
我担心庞大而复杂的数据结构。我喜欢大而简单的数据结构,特别是数组。当我有大而简单的数据结构时,我可以尝试用内存访问做一些聪明的事情,以真正优化我对缓存的使用,特别是内存平铺。不确定这是否对您有用,但一般来说,考虑到您的一组需求和对代码的现有理解,我会寻找方法来优化从RAM到CPU的数据获取。 当然,我会把这一切和地狱相提并论。除非你有多台电脑,否则不可能。哦,备忘录就在里面,我们这几天都有!! 祝你好运,一定要让我们知道你是怎么相处的。我读了很多关于优化这段代码或那段代码的最好方法的废话,很少有确凿的证据表明任何人都会像你所做的那样去衡量任何事情。 我非常喜欢你的问题,我反对。 当做 作记号 |
5
3
从优化自己的时间开始。不要 打扰 尝试盲目地列出和/或应用优化。不要因为不信任编译器而浪费时间将返回值转换为引用参数。
不要浪费时间手动将函数标记为
97%的代码 没关系 性能方面。如果您尝试应用优化,不管它们做什么和在哪里有用,您将浪费97%的时间。一直以来 能够 已经花了3%的时间优化实际重要的代码。(顺便说一句,这就是Knuth用“万恶之源”这句话的真正含义。不是说不应该执行优化,而是除非您有一段已经知道是热点的特定代码,否则您的优化 将 1)过早,2)无效) 所以,第一个优化建议是:关闭这个问题,然后寻求帮助来优化应用程序中重要的特定代码。你不会学到任何有用的东西来优化你的应用程序的3%,重要的是通过要求 一般的 优化技巧。 第二个优化建议(假设您现在正在查看一个特定的热点,并且在选择正确的算法、并行化和其他高级优化方面已经尽了最大努力): 查看编译器的程序集输出。 第三个优化建议:了解正在运行的系统。构造代码以利用空间和时间位置,以最小化缓存未命中。简单地将二维数组的遍历从列主顺序切换到行主顺序可以很容易地提高性能。请记住,编译器和CPU都会重新排序指令以提高吞吐量,但是分支限制了它们执行此操作的能力,因此,请尝试构造代码以获得相当大的基本块,而不需要跳入或跳出它们。如果您在支持SIMD指令的CPU上运行,请考虑它们是否可以有效地使用。如果您必须深入研究指令级优化,请确保您掌握了所用指令的延迟。对于浮点重代码,请记住,通常情况下,fp指令不会被编译器或CPU自动重新排序。因为fp操作有相当长的延迟,依赖链可能是一个真正的性能杀手。手动分解这些可以显著加快代码的速度。同样,避免内存依赖。首先写入然后读取地址的代码将变慢。如果一个或两个内存访问不能被优化,那么在开始读取之前,您必须等待写入完成(否则可能在后台发生,而不会停止CPU)。将所有经常使用的数据临时放置,以避免出现别名。 如你所要求的那样优化“大型复杂数据集”?我完全不知道。关于复杂数据集的问题是它们几乎没有共同点。没有 一般的 优化它们的方法。
最后一个建议:听起来你并不是真的在写C++。你说的是手动实现动态数组,你说的是reallocs和mfc类。听上去你在写“C和班级”。使用标准库。
|
6
3
我很惊讶似乎没有人对这一点做出回应。在你的问题中,你提到使用
|
7
2
我很同情你的立场,尤其是
我想你已经做好了智能编码应用程序的工作。现在,我建议:
我的经验是 你还有很多加速的空间 . This is my canonical example. …祝你好运。让我们知道它是如何运作的。 |
8
1
+1个好问题。 咆哮 我认为你要求人们不要抱怨过早的优化是正确的——通常这个老栗子被推出来作为懒惰设计或草率实现的借口。有这样一种情况,即在优化下是没有意义的,通常是由于算法选择不当造成的。 结尾咆哮 我不知道这97%的东西是从哪里来的。我被教导80/20规则——20%的代码运行80%的时间,有趣的是,这似乎也适用于除软件以外的其他事情。总之… 第一个调用端口始终是算法-确保使用有效的算法。一个未经优化的好算法几乎总能击败一个高度优化的坏算法。我怀疑你已经知道了。 我发现一些一般的优化是有用的:
|
9
0
如果您在采样探查器下运行代码,发现有任何计算密集型例程占用大量时间,那么可以考虑许多微优化,如果您能够将支持限制到特定的CPU,则可以考虑使用SIMD。 |
Hatsune Miku · 比较或if语句是否更快[已关闭] 1 年前 |
Black Swan · 无法解压缩的值太多(应为2)错误 1 年前 |
Kai · 有什么方法可以轻松优化VSCode中的锈迹? 2 年前 |
Balfar · 处理NumPy阵列上的循环最有效的方法是什么? 2 年前 |
Daniel · C#轻松存储快速访问的大型位矩阵 6 年前 |
halbe · 优化音频DSP程序的numpy计算 6 年前 |
Afsara · 是否有任何方法不能优化我们的应用程序? 6 年前 |