Questions tagged «optimization»

优化是改进现有程序以使其更有效地工作和/或使用较少资源的过程。

17
过早的优化真的是万恶之源吗?
我的一位同事今天提交了一个名为的类ThreadLocalFormat,该类基本上将Java Format类的实例移动到了线程本地中,因为它们不是线程安全的,而且创建起来“相对昂贵”。我写了一个快速测试,计算出我每秒可以创建200,000个实例,问他是否创建了那么多实例,对此他回答“远不及那么多”。他是一位出色的程序员,并且团队中的每个人都非常熟练,因此我们对所生成的代码毫无疑问,但这显然是在没有实际需要的情况下进行优化的情况。他应我的要求取消了代码。你怎么看?这是“过早优化”的案例吗,真的有多糟糕?

30
编码时微优化重要吗?
最近,我问堆栈溢出问题,找出原因isset()函数比的strlen()快于PHP。这引发了关于可读代码的重要性以及是否值得考虑提高代码中微秒级性能的问题。 我父亲是一位退休的程序员,我给他看了答案。他绝对确定,即使是程序员,即使在微级别上也没有考虑其代码的性能,那么他们就不是优秀的程序员。 我不太确定-也许计算能力的提高意味着我们不再需要考虑这些微性能的改进?也许这种考虑取决于编写实际语言代码的人?(在上述情况下为PHP)。 环境因素可能很重要-互联网消耗了世界能源的10%。我想知道在数百万个网站上万亿次复制时,浪费几微秒的代码是多少? 我想最好根据有关编程的事实来了解答案。 编码时微优化重要吗? 我个人对25个答案的总结,谢谢大家。 有时我们确实需要担心微优化,但仅在极少数情况下才需要担心。在大多数情况下,可靠性和可读性更为重要。但是,不时考虑进行微优化并没有什么坏处。基本的理解可以帮助我们在编码时不要做出明显的错误选择,例如 if (expensiveFunction() || counter < X) 应该 if (counter < X || expensiveFunction()) (来自@ zidarsk8的示例)这可能是一个便宜的函数,因此更改代码将是微优化。但是,有了基本的了解,您就不必这样做了,因为您一开始就可以正确地编写它。

20
可以用可读代码替换优化代码吗?
有时,您会遇到必须扩展/改进某些现有代码的情况。您会看到旧代码非常精简,但是它也很难扩展,而且花时间阅读。 用现代代码代替它是一个好主意吗? 一段时间以前,我喜欢精益方法,但现在看来,最好牺牲很多优化,而采用更高的抽象,更好的接口和更易读,可扩展的代码。 编译器似乎也越来越好,因此诸如之类struct abc = {}的东西被悄无声息地变成了memsets,shared_ptrs产生的代码几乎与原始指针扭曲相同,模板工作得很好,因为它们产生了超精简代码,依此类推。 但是,有时您仍然会看到基于堆栈的数组和带有一些晦涩逻辑的旧C函数,通常它们不在关键路径上。 如果您必须以某种方式触摸其中的一小部分代码,那么更改这种代码是一个好主意吗?

14
什么时候优化不是过早的,因此不是邪恶的?
“过早的优化是万恶之源”,这几乎是我们所有人都听过/读过的。我很好奇什么样的优化不是过早的,即在软件开发的每个阶段(高级设计,详细设计,高级实现,详细实现等),我们可以考虑的优化程度是什么,而不必跨入阴暗面。

19
我为什么要关心微观性能和效率?
C / C ++页面上的许多问题和答案,特别是或间接地讨论了微性能问题(例如,间接函数,直接函数与内联函数的开销),或者使用O(N 2)vs O(N log N)算法100个项目列表。 除非或直到我知道我有问题,否则我始终不关心微性能,也不关心宏性能,而是专注于易于维护的可靠代码。 我的问题是,为什么很多程序员这么在乎呢?对于大多数开发人员来说,这真的是一个问题吗?我是否只是幸运地不必为此担心太多,还是我是一个糟糕的程序员?

9
90/10程序优化规则的含义是什么?
根据Wikipedia的介绍,程序优化的90/10规则指出:“程序执行时间的90%用于执行10%的代码”(请参见此处的第二段)。 我真的不明白。这到底是什么意思?如何仅在执行10%的代码上花费90%的执行时间?那么其余90%的代码呢?如何仅在10%的时间内执行它们?


15
语言如何影响CPU设计?[关闭]
人们经常被告知,硬件并不在乎用哪种语言编写程序,因为它只能看到编译后的二进制代码,但这并不是全部。例如,考虑一下不起眼的Z80;它对8080指令集的扩展包括CPIR之类的指令,可用于扫描C样式(以NULL结尾的)字符串,例如执行strlen()。设计人员必须已经确定,运行C程序(与Pascal相反,在Pascal中,字符串的长度位于标头中)是他们的设计可能会使用的东西。另一个经典的例子是Lisp Machine。 还有什么其他例子?例如,使特定处理器偏爱特定语言约定的指令,寄存器的数量和类型,寻址模式?我对同一家庭的修订特别感兴趣。

7
在软件编程中,是否可以使CPU和GPU的负载均达到100%?
这是一个关于游戏玩家我感兴趣的主题的普遍问题:CPU / GPU瓶颈和编程。如果我没记错的话,我已经了解到CPU和GPU都可以计算内容,但是由于体系结构的差异,在某些计算中它要比另一种更好。例如,在GPU上破解哈希或进行加密货币挖掘似乎比在CPU上效率更高。 所以我想知道:难道在GPU负载为100%而CPU在50%的情况下运行GPU是不可避免的吗? 或更准确地说:如果第一个计算负载为100%,那么两者通常都达到100%的负载,那么通常由GPU完成的某些计算可以由CPU完成吗? 我已经搜索了一些关于该主题的内容,但是空手而归。我认为并希望它在本小节中有应有的地位,并欢迎您提供给我的任何文档或讲座!

4
可以走多快?
Go是少数应该“接近金属”运行的语言之一,也就是说,它是经过编译,静态类型化的,并且无需VM即可在本地执行代码。这应该使其相对于Java,C#等具有速度优势。但是,它似乎落后于Java(请参阅《编程语言实战》) 我假设不太成熟的编译器对此负有很大责任,但是还有其他原因吗?Go的设计中是否有固有的功能可以阻止它比Java更快地运行?我对运行时模型有一个非常简单的看法,但是由于本地代码的执行,看来至少在原则上它应该比Java运行得更快。


4
适用于C,C ++等的JIT编译器
是否有针对C和C ++等已编译语言的即时编译器?(想到的第一个名字是Clang和LLVM!但是我不认为它们目前支持它。) 说明: 我认为该软件可以受益于运行时性能分析反馈以及在运行时对热点进行积极优化的重新编译,即使对于C和C ++等编译为机器的语言也是如此。 概要文件引导的优化可以完成类似的工作,但是不同的是,JIT在不同的环境中会更加灵活。在PGO中,您在运行二进制文件之前先运行它。发行后,它将不会在运行时收集任何环境/输入反馈。因此,如果更改输入模式,则可能会降低性能。但是,即使在这种情况下,JIT也能很好地工作。 但是,我认为JIT编译性能的好处是否超过其自身的开销是有争议的。

5
如果您仍然需要检查条件,则分支预测如何工作?
我正在从https://stackoverflow.com/q/11227809/555690阅读有关分支预测的流行答案,这使我感到困惑: 如果您猜对了,它将继续进行。 如果您猜错了,机长会停下来,后退并大喊大叫,以拨动开关。然后,它可以沿着其他路径重新启动。 如果您每次都猜对了,火车将永远不会停止。 如果您经常猜错,火车将花费大量时间停止,备份和重新启动。 但这不是我所能得到的:要知道您的猜测是对还是错,无论如何都必须进行条件检查。那么,如果您仍在进行相同的条件检查,那么分支预测甚至如何工作? 我要说的是,分支预测是否与完全没有分支预测完全相同,因为无论如何您都在执行相同的条件检查?(显然我错了,但我不明白)

2
纯抽象类和接口的实现
尽管在C ++标准中这不是强制性的,但例如,GCC似乎通过在每个相关类的实例中都包含指向该抽象类的v表的指针来实现父类(包括纯抽象类)的方式。 自然,这通过其具有的每个父类的指针使该类的每个实例的大小膨胀。 但是我注意到许多C#类和结构都有很多父接口,它们基本上是纯抽象类。如果对say的每个实例Decimal都充满了指向所有各种接口的6个指针,我会感到惊讶。 因此,如果C#确实使用不同的接口,至少在典型的实现中,它如何实现它们(我知道标准本身可能没有定义这种实现)?在将纯虚拟父代添加到类时,是否有任何C ++实现都可以避免对象大小膨胀?

9
如何处理关于“过早优化是万恶之源”的误解?
我遇到了很多人,他们在原则上反对任何在英语中通常被认为是“优化”的东西,他们经常逐字引用(部分)引用“过早的优化是万恶之源”。作为他们立场的理由,暗示他们将我所说的一切解释为“过早的优化”。但是,这些视图有时是如此可笑地根深蒂固,以至于它们几乎消除了任何与最纯粹的“天真的”实现方式有关的算法或数据结构偏差……或者至少与它们之前的工作方式无关。在听到“性能”或“优化”的消息后,人们如何才能像这样使人们再次“张开耳朵”?我该如何讨论对性能有影响的设计/实现主题,而又不会让人立即想到:“这个人想花两周时间来编写十行代码?” 现在,在这里以及在Web的其他角落已经讨论了 “是否所有优化都是过早的并因此有害的”的立场,并且已经讨论了如何识别优化何时过早并因此有害的立场,但是不幸的是,现实世界中仍有一些人不愿意挑战自己对反优化的信念。 以前的尝试 几次,我试图提供Donald Knuth的完整报价,以解释“过早的优化是不好的”↛“所有的优化都是不好的”: 我们应该忘记效率低下的问题,例如大约97%的时间:过早的优化是万恶之源。然而,我们不应放弃我们那临界的3%的机会。 但是,在提供完整报价时,这些人有时有时会变得更加确信我在做的是Premature Optimization™,并深入研究并拒绝听。好像“优化”一词使他们感到害怕:在某些情况下,我能够通过避免使用“优化(e | ation)”一词来提出实际的性能改进代码更改,而不会被否决。和“性能”(这个词也很吓人),而是使用“替代架构”或“改进的实现”之类的表达方式。因此,这似乎真的是教条主义,而不是他们实际上是对我的批评进行评估,然后视其为不必要和/或过于昂贵而将其驳回。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.