Questions tagged «optimization»

优化是改进方法或设计的行为。在编程中,优化通常采取提高算法速度或减少所需资源的形式。优化的另一个含义是机器学习中使用的数值优化算法。



7
为什么在Ruby中构建字符串时,铲运算符(<<)优于正等号(+ =)?
我正在研究Ruby Koans。 about_strings.rb中的test_the_shovel_operator_modifies_the_original_stringKoan 包含以下注释: 在构建字符串时,Ruby程序员倾向于使用铲运算符(&lt;&lt;)而不是加等于运算符(+ =)。为什么? 我的猜测是它涉及速度,但我不了解引擎盖下的动作会导致铲子操作员更快。 有人可以解释此偏好背后的详细信息吗?


20
而(1)for(;;)是否存在速度差异?
长版... 一位同事在看到我while (1)在for (;;)更快的Perl脚本中使用后断言。我认为他们应该是一样的,希望解释器可以优化任何差异。我设置了一个脚本,该脚本将为循环迭代和相同数量的while循环运行1,000,000,000,并记录它们之间的时间。我发现没有明显的区别。我的同事说,一位教授告诉他while (1)正在进行比较1 == 1,for (;;)而没有进行比较。我们使用C ++的迭代次数进行了100倍的重复相同的测试,并且差异可以忽略不计。但是,这是一个图形示例,说明了与脚本语言相比,编译后的代码可以提高多少速度。 精简版... 如果您需要无限循环来突破,有什么理由while (1)比a for (;;)优先? 注意:如果问题尚不清楚。这纯粹是几个朋友之间有趣的学术讨论。我知道这不是所有程序员都应该苦恼的超级重要概念。感谢您提供的所有出色答案,我(而且我敢肯定其他人)已经从这次讨论中学到了一些东西。 更新:上述同事在下面进行了回应。 以防万一它被埋在这里。 它来自AMD组装程序员。他说C程序员(人)没有意识到他们的代码效率低下。他今天说,但是,gcc编译器非常好,使像他这样的人破产了。他举例称,并告诉我关于while 1VS for(;;)。我现在已经习惯使用它了,但是由于它们已经过优化,因此gcc尤其是解释器这两天都将执行相同的操作(处理器跳转)。

30
如果该行或列包含0,则将矩阵中的每个单元格设置为0
想要改善这篇文章吗?提供此问题的详细答案,包括引文和答案正确的解释。答案不够详细的答案可能会被编辑或删除。 给定一个0x和1s的NxN矩阵。将包含a的每一行设置0为all 0,并将包含a的每一列设置0为all 0。 例如 1 0 1 1 0 0 1 1 1 0 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 结果是 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 …

5
哪些C ++编译器进行尾递归优化?
在我看来,在C和C ++中执行尾递归优化将非常有效,但是在调试时,我似乎从未看到指示这种优化的帧堆栈。这很好,因为堆栈告诉我递归的深度。但是,优化也会很好。 是否有任何C ++编译器都进行了此优化?为什么?为什么不? 如何告诉编译器执行此操作? 对于MSVC:/O2或/Ox 对于海湾合作委员会:-O2或-O3 在某些情况下,检查编译器是否已执行此操作呢? 对于MSVC,启用PDB输出以能够跟踪代码,然后检查代码 对于海湾合作委员会..? 我仍然会建议如何确定某个函数是否通过编译器进行了优化(即使我放心Konrad告诉我假设也是如此)。 总是可以通过进行无限递归检查编译器是否完全做到了这一点,并检查它是否导致无限循环或堆栈溢出(我用GCC这样做并发现-O2足够了),但是我想能够检查某个我知道会终止的功能。我希望有一个简单的方法来检查这个:) 经过一些测试,我发现析构函数破坏了进行此优化的可能性。有时更改某些变量和临时变量的范围以确保它们在返回语句开始之前超出范围是值得的。 如果在尾调用之后需要运行任何析构函数,则无法完成尾调用优化。

7
检测浏览器选项卡是否具有焦点
是否有可靠的跨浏览器方式来检测选项卡是否具有焦点。 情况是,我们有一个应用程序定期轮询股票价格,如果页面没有重点关注,我们可以停止轮询并为每个人节省交通噪音,尤其是当人们热衷于打开具有不同投资组合的多个标签时。 是window.onblur并且window.onfocus为此选择吗?

8
没有“ Else”的JavaScript中的三元运算符
我一直不得不放置null没有任何其他条件的条件。反正周围有吗?例如 condition ? x = true : null; 基本上,有什么方法可以做: condition ? x = true; 现在它显示为语法错误 仅供参考,这是一些真实的示例代码: !defaults.slideshowWidth ? defaults.slideshowWidth = obj.find('img').width()+'px' : null;

19
超越堆栈采样:C ++ Profiler
黑客的故事 日期是2010年12月2日。圣诞节前的日子不多了,作为Windows程序员,我几乎遇到了一个主要障碍。我一直在使用AQTime,尝试过困倦,发亮和非常困倦,而正如我们所说的,VTune正在安装。我曾尝试使用VS2008 Profiler,但它一直在积极地惩罚着人们,而且常常是不明智的。我使用了随机暂停技术。我已经检查了呼叫树。我已经解雇了功能痕迹。但令人悲伤的事实是,我正在使用的应用程序超过一百万行代码,可能还有价值一百万行的第三方应用程序。 我需要更好的工具。 我已经阅读了其他主题。 我已经尝试了每个主题中列出的每个事件探查器。简直就是必须有比这些笨拙而昂贵的选择更好的东西,或者可笑的工作量几乎没有收益。更复杂的是,我们的代码具有大量线程,并运行许多Qt Event循环,其中某些循环如此脆弱,以至于它们由于时序延迟而在繁重的测试中崩溃。不要问我为什么我们要运行多个事件循环。没有人能告诉我。 在Windows环境中,Valgrind还有更多选择吗? 有没有比我已经尝试过的一堆破烂的工具更好的东西了? 是否有任何旨在与Qt集成的东西,也许可以在队列中显示有用的事件? 我尝试过的工具的完整列表,以及在斜体中真正有用的工具: AQTime:很好!深度递归会遇到一些麻烦,但是在这些情况下,调用图是正确的,并且可以用来消除您可能遇到的任何混乱。不是一个完美的工具,但是值得尝试。它可能适合您的需求,并且在大多数情况下对我来说已经足够了。 调试模式下的随机暂停攻击:没有足够的时间信息。 一个好的工具,但不是一个完整的解决方案。 并行工作室: 核选项。引人入胜,古怪而疯狂。我认为您应该进行30天的评估,并确定是否合适。这也太酷了。 AMD Codeanalyst:很棒 ,易于使用,非常容易崩溃,但是我认为这是环境问题。我建议您尝试一下,因为它是免费的。 卢克·斯塔克沃克(Luke Stackwalker):在小型项目上运行良好,这是在尝试使其在我们的项目上运行。虽然有一些不错的结果,但是它绝对可以代替Sleepy来完成我的个人任务。 PurifyPlus:不支持Win-x64环境,最主要的是Windows7。否则,它非常出色。我在其他部门的许多同事对此表示肯定。 VS2008 Profiler:在功能跟踪模式下以所需的分辨率产生100 + gigs范围的输出。从好的方面来说,产生可靠的结果。 GProf:要求GCC还要适度有效。 VTune:VTune的W7支持犯罪分子的边界。否则优秀 PIN:我需要破解我自己的工具,所以这是最后的选择。 Sleepy \ VerySleepy:对于较小的应用程序很有用,但在这里让我失望。 EasyProfiler:如果您不介意使用一些手动注入的代码来指示要检测的位置,那还不错。 Valgrind:仅* nix,但在那种环境下非常好。 OProfile:仅Linux。 亵渎:他们射击野马。 我没有尝试过的建议工具: XPerf: 发光代码: 开发伙伴: 注意:目前是 Intel环境。VS2008,增强库。Qt 4+。而所有这些令人沮丧的杂物:通过trolltech进行Qt / MFC集成。 现在:大约两周后,看来我的问题已解决。借助各种工具,包括列表中的几乎所有内容以及我的一些个人技巧,我们找到了主要的瓶颈。但是,我将继续测试,探索和尝试新的探查器以及新技术。为什么?因为我欠你们,因为你们摇滚。它确实使时间线放慢了一点,但是我仍然很高兴继续尝试新工具。 简介 在许多其他问题中,最近将许多组件切换到了错误的线程模型,由于下面的代码突然不再是多线程的,导致了严重的问题。我不能说太多,因为它违反了我的NDA,但是我可以告诉您,通过偶然检查甚至常规代码检查都不会发现它。如果没有探查器,通话记录和随机暂停的共同作用,我们仍然会对天空的美丽蓝色弧线大怒。值得庆幸的是,我与一些我见过的最好的黑客一起工作,而且我可以接触到一个充满了强大工具和才华横溢的“诗篇”。 绅士们,我非常感谢您,很遗憾,我没有足够的代表来奖励你们每个人。我仍然认为,这是一个重要的问题,比到目前为止我们在SO上获得的答案更好。 …


30
您看到的最荒谬的悲观是什么?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 我们都知道,过早的优化是万恶之源,因为它会导致代码无法读取/无法维护。更悲观的是悲观主义,因为有人实施“优化”是因为他们认为这样做会更快,但最终会变得更慢,而且有漏洞,无法维护等。您所看到的最荒谬的例子是?

5
为什么(%256)与(a&0xFF)不同?
我一直认为执行(a % 256)优化程序时自然会使用高效的按位运算,就像我写的那样(a &amp; 0xFF)。 在编译器资源管理器gcc-6.2(-O3)上进行测试时: // Type your code here, or load an example. int mod(int num) { return num % 256; } mod(int): mov edx, edi sar edx, 31 shr edx, 24 lea eax, [rdi+rdx] movzx eax, al sub eax, edx ret 当尝试其他代码时: // Type your code here, …
145 c++  optimization 

12
密封课程真的可以带来绩效收益吗?
我遇到了很多优化技巧,这些技巧说您应该将类​​标记为已密封,以获得更多的性能优势。 我进行了一些测试以检查性能差异,但没有发现。难道我做错了什么?我是否错过了密封类会带来更好结果的情况? 有没有人进行测试并发现差异? 帮我学习:)

5
在Python中处理非常大的数字
我一直在考虑使用Python快速评估手牌。在我看来,加快处理速度的一种方法是将所有牌面和西服表示为质数,然后将它们相乘以表示手。白衣: class PokerCard: faces = '23456789TJQKA' suits = 'cdhs' facePrimes = [11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 53, 59, 61] suitPrimes = [2, 3, 5, 7] 和 def HashVal(self): return PokerCard.facePrimes[self.cardFace] * PokerCard.suitPrimes[self.cardSuit] 这将为每只手提供一个数值,通过模可以告诉我手中有多少个国王或有多少个心。例如,任何有五个或更多球杆的手都会平均除以2 ^ 5;任何有四位国王的手将平均除以59 ^ 4,依此类推。 问题在于,像AcAdAhAsKdKhKs这样的七张牌手的散列值约为62.7万亿次,这需要超过32位才能在内部进行表示。有没有一种方法可以在Python中存储如此大的数字,从而允许我对其执行算术运算?

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.