Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我的C代码运行缓慢?_C_Performance - Fatal编程技术网

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

为什么我的C代码运行缓慢?,c,performance,C,Performance,我用C语言编写了一些代码,我惊讶地发现它比我预期的要花更长的时间来执行。我想知道哪些行动是昂贵的,以及如何摆脱它们 我使用赋值语句、条件(嵌套)、循环、函数调用和回调 对于常见的C性能陷阱有哪些好的参考 我能用一个好的剖析器吗 谢谢大家 谢谢你的投入。你说得绝对正确:算法可以大大降低速度。虽然通过编码实践可以获得一点性能提升,但我100%相信只有错误的算法才能大大降低速度 事实上:我正在研究RB树,并按升序插入节点。它花费了大量的时间(和二叉搜索树(倾斜)一样糟糕)。在征求了你的意见后,我检查

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

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

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

我能用一个好的剖析器吗


谢谢大家

谢谢你的投入。你说得绝对正确:算法可以大大降低速度。虽然通过编码实践可以获得一点性能提升,但我100%相信只有错误的算法才能大大降低速度

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


再次感谢您的建议。

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

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

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


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

您有权访问GNU工具链吗?如果是,请查看“gprof”。这是一个剖析器。。。适合查找瓶颈。

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

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

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


有关MSVC的信息,请参阅或甚至不要浪费时间寻找“昂贵”的操作。当然,除了库之外,C中几乎没有

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

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


优化算法,而不是代码。

这是一个老生常谈的话题

分析是一种选择,但如果您有一个调试器,有两种老式技术工作得出奇地好:

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

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

不要做大多数人做的事。大多数人所做的是1)勇敢地谈论剖析,然后2)猜测问题所在并加以解决。如果你四处寻找“快速行动”,你就没有抓住要点。除非你通过上面的一项调查来证明它是什么,否则你永远也无法修复正确的东西


您可以发布代码吗?这是一个非常广泛的问题。您能提供更多详细信息吗?无法按原样上载代码,可以在一段时间内上载模拟代码。@Rich感谢所需的更改。很好。很高兴听到这个消息。“不要浪费时间去寻找‘昂贵’的操作。当然,除了库之外,C中几乎没有任何操作。”-完全正确。非常感谢你。