许多方法会扼杀代码速度?

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 这样的东西也会是首选,因为你可以稍后告诉它是什么,如果你有更多的表格以及何时有更多的表格。尝试使用 DatabaseFormLoginFormUserEditorForm 或其他名称。 方法调用是 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 绝地反击!

Windows 11 将“扼杀”第三方浏览器?Firefox 绝地反击!

测试代码的速度?

剖析 C++ 代码编译速度

什么影响代码的速度?

用 PyPy 让你的 Python 代码运行得更快!