代码之家  ›  专栏  ›  技术社区  ›  FL4SOF

为什么我的C代码运行缓慢?

  •  2
  • FL4SOF  · 技术社区  · 16 年前

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

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

    对于常见的C性能陷阱有哪些好的参考?

    我能用一个好的轮廓仪吗?


    谢谢大家

    感谢您的所有投入。你是绝对正确的:这是一种算法可以使事情变慢(彻底)。虽然通过编码实践可以获得一点性能提升,但我100%相信 只有错误的算法才能大大降低速度 .

    事实上:我在研究RB树,并按升序插入节点。这花费了大量的时间(和二叉树(倾斜)一样糟糕)。在征求你的意见后,我检查了算法,在那里我犯了一个平衡错误,这使得树倾斜(倾斜)。我改正了。

    再次感谢您的建议。

    6 回复  |  直到 16 年前
        1
  •  20
  •   Ori Pessach    16 年前

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

    发布代码可能很有用。告诉我们你想做什么,你使用的算法也会有帮助。事实上,你的问题没有提供足够的信息给任何人给你一个有用的答案。

    其他人建议gprof-i其次,如果您对分析代码感兴趣的话。我以前也用过vtune,并且喜欢它。但是首先要确保您理解您的代码及其功能,并且在处理您期望它处理的数据量时,您正在实现的算法是高效的。

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

        2
  •  3
  •   Community Mohan Dere    8 年前

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

    分析是一种选择,但是如果您有一个调试器,那么有两种老式的技术可以非常好地工作:

    • 如果不需要一整天,只需一步代码就可以了。我保证你会得到一个非常好的主意,如果它做任何它不真正需要做的事情。

    • 如果这需要太长的时间,只需给它足够的数据,或者让程序在顶层重复自己,这样它就可以运行很长的时间,至少几秒钟。当它运行时,手动中断它并准确记录它正在做什么和 为什么? .这样做几次。当然,你也会从一步一步的过程中获得同样的洞察力。

    不要像大多数人那样做。大多数人做的是1)勇敢地谈论分析,然后2)猜猜问题是什么,然后解决问题。如果你在四处寻找“快速行动”,你就错过了要点。除非你通过上面的一项调查来证明这是什么,否则你永远不会解决正确的事情。

    explained on WikiHow

    a good explanation on SO

        3
  •  2
  •   Javier    16 年前

    不要浪费时间去寻找“昂贵”的业务。当然,除了图书馆,C语言中几乎没有。

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

    在“大O”符号中:全集比较是 O(n x m) 或粗略地 O(n^2) 如果 n m 是相似的。但顺序阅读是 O(n/2) 平均来说,整个事情就是 O(n^3/2) 论阅读+ O(n ^ 2) 比较。加上散列 aO(2n)+bO(2n)+cO(n^2) ,或者只是 O(n ^ 2)

    优化算法,而不是代码。

        4
  •  1
  •   dirkgently    16 年前

    检查内存分配。和函数调用。如果您使用gcc,请使用-pg选项编译它,并运行它 gprof . vs团队系统版本自带一个分析器。所以,选你的吧。

        5
  •  1
  •   Community Mohan Dere    8 年前

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

    您最好在启用分析的情况下运行您的代码,并查看哪些部分成本最高。(这取决于你的平台,你会怎么做)。

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

        6
  •  0
  •   eduffy    16 年前

    您可以访问GNU工具链吗?如果是,请查看“gprof”。它是一个剖析者…有助于发现瓶颈。