许多方法会扼杀代码速度?
Posted
技术标签:
【中文标题】许多方法会扼杀代码速度?【英文标题】:Many Methods Kill Code Speed? 【发布时间】:2010-08-06 17:52:28 【问题描述】:我正在构建一个比应有速度慢得多的应用程序(一个过程需要 4 秒,而它应该只需要 0.1 秒,这至少是我的目标)。
我有一堆方法可以将数组从一个传递到另一个。这使我的代码保持良好和有条理,但我担心它会降低我的代码效率。
任何人都可以确认是否是这种情况?
另外,我的所有代码都包含在一个与我的 UI 分开的类中。与将代码包含在 Form1.cs 文件中相比,这是否会使运行速度明显变慢?
编辑:大约有 95000 个点需要计算,每个点经过 7 种方法进行额外计算。
【问题讨论】:
您将不得不向我们提供更多信息。除非您进行数百万次迭代,否则 4 秒非常慢。 也许你可以给我们一个样品。有很多事情可能会导致这样的问题。 数组是通过引用传递的,而不是值,所以它不是一个“复制”会减慢你的代码(因为数组 ISN'T 被复制了)。 另外,重命名Form1.cs
。甚至像MainForm.cs
这样的东西也会是首选,因为你可以稍后告诉它是什么,如果你有更多的表格以及何时有更多的表格。尝试使用 DatabaseForm
、LoginForm
、UserEditorForm
或其他名称。
方法调用是 CLR 中最慢的操作码之一,但拜伦是对的,除非在极度迭代的情况下,否则它不应该发挥作用。
【参考方案1】:
您是否尝试过任何分析或性能工具来缩小出现减速的原因?
它可能会向您展示可用于重构代码和提高性能的方法。
另一个用户提出的这个问题有几个选项可供您选择:
Good .Net Profilers
【讨论】:
最低限度将是一个代码示例......分析很棒,但一些(我认为大多数)性能问题可以一目了然。 @Matthew:有时,在小程序中,也许吧。我见过人们写for (i = 0; i < a.Count; i++) cout << a[i];
并想知道写++i
是否会有所帮助,或者想知道编译器是否会优化a.Count
以使其运行得更快。 (提示:99.99% 的时间在cout
。)
@Soo:要听的答案是那些说“个人资料 - 不要猜测”的答案。我使用手动暂停技术,这在任何语言中都非常有效,包括 C#。你说它花费的时间比你预期的要长 40 倍?然后,如果您暂停几次,就可以保证看到问题。原因如下:***.com/questions/1777556/alternatives-to-gprof/…【参考方案2】:
没有。这不是扼杀代码速度的原因,除非许多方法意味着像一百万或其他东西。您在数组中迭代的东西可能比您需要或意识到的要多,而且数组本身的内存占用可能比您意识到的要大。
也许您应该研究一种设计,而不是将数组传递给 7 个方法,而是将数组迭代一次,将成员传递给 7 个方法,这样可以最大限度地减少迭代 95000 个成员的次数。
【讨论】:
吉米,我终于找到你了 ;-)【参考方案3】:一般来说,函数调用足够基本,可以被任何解释器(或编译器)高度优化。因此,这些不会在运行时产生太大的爆炸。事实上,如果将您的问题包装成一些花哨的迭代解决方案,您可以省去处理堆栈,而是必须处理一些迭代变量,这并不难。
我知道,有些程序员想知道为什么他们的递归算法这么慢,直到有人告诉他们不要按值传递数组条目。
您应该提供一些示例代码。一般来说,你应该针对其他瓶颈,或者寻找其他算法。
【讨论】:
【参考方案4】:只需要针对一个好的分析工具运行它。我有一些我希望只用 4 秒的东西 - 一次处理超过一亿条记录。
【讨论】:
【参考方案5】:数组是引用类型而不是值类型。因此,您永远不会传递数组。您实际上是将指针传递给内存中的数组。所以传递数组不是你的问题。很可能您对阵列的处理方式有疑问。你需要按照 Jamie Keeling 所说的去做,通过分析器运行它,或者甚至只是调试它,看看你是否陷入了一些大循环。
【讨论】:
他正在按值传递引用。这会在堆栈递增时复制指向引用的指针。【参考方案6】:为什么要将它们全部加载到一个数组中并依次执行每个方法,而不是在加载时遍历它们?
如果您可以(从任何输入源)获取它们并处理它们并输出它们(无论是屏幕,文件我们的任何地方),这将不可避免地使用更少的内存并至少减少启动时间。
如果此答案适用于您的情况,请首先更改您的方法以处理枚举而不是数组(非破坏性更改,因为数组是枚举),然后更改您的输入方法以生成已加载而不是加载的返回项整个数组。
【讨论】:
【参考方案7】:很抱歉发布旧链接(.NET 1.1),但它包含在 VS2010 文章中,所以: Here you can read about method costs. (Initial link)
然后,如果您从 VS 启动代码(没关系,即使在发布模式下),VS 调试器会连接到您的代码并减慢它的速度。
我知道,对于这个建议,我会被淘汰,但是...最大性能将通过数组的不安全操作来实现(是的,这是不安全的,但是当有性能交易时,所以...)
最后 - 重构你的代码以使用最少的方法来处理你的数组。它将提高性能。
【讨论】:
不好的建议。我保证他的问题与他掌握的方法数量完全无关。以上是关于许多方法会扼杀代码速度?的主要内容,如果未能解决你的问题,请参考以下文章
Windows 11 将“扼杀”第三方浏览器?Firefox 绝地反击!