为啥我的 C 代码运行缓慢?

Posted

技术标签:

【中文标题】为啥我的 C 代码运行缓慢?【英文标题】:Why does my C code run slow?为什么我的 C 代码运行缓慢? 【发布时间】:2009-02-19 16:08:39 【问题描述】:

我用 C 语言编写了一些代码,我很惊讶地发现执行时间比我预期的要长。我想知道哪些操作成本高昂以及如何摆脱它们。

我使用赋值语句、条件(嵌套)、循环、函数调用和回调。

对于常见的 C 性能缺陷,有哪些好的参考资料?

我可以使用一个好的分析器吗?


谢谢大家

感谢您的所有意见。你是绝对正确的:算法可以(极大地)减慢速度。尽管通过编码实践可以实现一点性能提升 - 我 100% 相信只有错误的算法才能大大减慢速度

事实上:我正在研究 RB 树并按升序插入节点。它花费了大量时间(与 Binary Search Tree (Skewed) 一样糟糕)。在征求您的意见后,我检查了我在平衡方面犯了错误的算法,这使树倾斜(倾斜)。我更正了。

再次感谢您的建议。

【问题讨论】:

可以发代码吗? 这是一个非常广泛的问题。你能提供更多细节吗? 无法按原样上传代码,过段时间可以上传一个mock。 @Rich 感谢所需的更改。 好。很高兴听到这个消息。 【参考方案1】:

您的性能问题可能更多地与您实现的算法有关,而不是与您使用的操作有关。

发布代码可能会有用。告诉我们您正在尝试做的事情以及您正在使用的算法也会有所帮助。事实上,您的问题没有提供足够的信息让任何人为您提供有用的答案。

其他人推荐了 gprof - 如果您有兴趣分析您的代码,我支持它。我以前也用过VTune,很喜欢。但首先要确保您了解您的代码及其作用,并且您正在实施的算法在处理您希望它处理的数据大小时是高效的。

顺便说一句,使用 C 并不意味着您的代码会自动运行得更快。 I/O 绑定代码通常不会看到性能改进。 UI 繁重的代码可能不会从使用低级语言中受益。通常,C 是一种更好的实现语言,您需要低级别访问,与硬件或低级别操作系统服务交互时,或者如果您有非常具体和严格的性能要求,而高级垃圾收集语言很难满足这些要求.或者如果你碰巧喜欢 C,但这显然是一个主观问题。

【讨论】:

【参考方案2】:

这是一个老生常谈的话题。

性能分析是一种选择,但如果您有调试器,则有一些老式技术效果惊人:

如果不需要一整天,请单步执行代码。我保证,如果它在做任何它并不真正需要的事情,你会得到一个很好的主意。

如果这需要太长时间,只需给它足够的数据,或者让程序在顶层重复自己,这样它就可以运行很长时间,至少几秒钟。在它运行时,手动中断它并记下它在做什么以及为什么。这样做几次。保证,您将获得与单步执行相同的洞察力。

不要做大多数人会做的事。大多数人所做的是1)勇敢地谈论分析,然后2)猜测问题是什么并解决它。如果您四处寻找“快速操作”,那么您就错过了重点。在您通过上述调查之一证明它是什么之前,您永远不会解决正确的问题。

explained on WikiHow

a good explanation on SO

【讨论】:

【参考方案3】:

不要浪费时间尝试寻找“昂贵”的操作。 C 中几乎没有,当然,除了库。

相反,请尝试估计您执行代码的每个部分的次数。例如,假设您将文件的每一行与另一个文件的每一行进行比较。如果每个文件有大约百分之一的行,您将进行大约一万次比较。没什么好担心的...但是如果您从文件开头选择每一行,您将阅读每一行一百万次。现在那不好了。您将需要一些真正随机访问的方式来读取每一行......或者,更好的是,阅读散列

在“大 O”表示法中:完整的比较是 O(n x m),或者如果 nm 相似,则大致为 O(n^2)。但是顺序读取平均是O(n/2),所以整个事情是O(n^3/2)阅读加上O(n^2)比较。使用散列将是aO(2n)+bO(2n)+cO(n^2),或者只是O(n^2)

优化算法,而不是代码。

【讨论】:

“不要浪费时间去寻找‘昂贵的’操作。当然,除了库之外,C 语言中几乎没有。” - 完全正确。非常感谢。【参考方案4】:

检查内存分配。和函数调用。如果您使用 gcc,请使用 -pg 选项使用分析信息编译它并通过gprof 运行它。 VS Team System 版本自带 Profiler。所以,任君挑选。

【讨论】:

【参考方案5】:

这是不可能的。您命名的所有元素都不是真的很慢,即使它们很慢,也不会自动意味着整个程序会因此而变慢。

您最好在启用分析的情况下运行您的代码,看看哪些部分是最昂贵的。 (这取决于您的平台,您将如何实际操作)。

有关 MSVC 的信息,请参阅 this post 或 this blog entry about profiling under MSVS 甚至 this question, and particularly the AMD CodeAnalyst answer

【讨论】:

【参考方案6】:

您可以访问 GNU 工具链吗?如果是这样,请查看“gprof”。这是一个探查器......非常适合发现瓶颈。

【讨论】:

以上是关于为啥我的 C 代码运行缓慢?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 Apps 脚本删除循环运行如此缓慢?我可以提高性能吗?

为啥这个 OpenGL ES 代码在 iPhone 上运行缓慢?

为啥多线程 python 程序在 ec2 微实例上运行缓慢?

为啥我的 Haskell 代码与 Swift 和 C 相比如此缓慢 [重复]

为啥我写的JS运行起来很缓慢?

为啥代码运行如此缓慢,以至于我在其中使用了 for 循环。有更快的方法吗?