提高C代码的性能

提高C代码的性能,c,performance,C,Performance,提高C代码性能的最非正统的方法是什么?这是不可阻挡的!一切都在进行,包括将循环结构更改为gotos、硬编码任何内容、以奇怪的方式使用case语句等。完全不用担心可维护性、可读性等 p、 这是很实用的。。。我很清楚如何以合理的方式提高代码的性能(改进算法、优化前进行概要分析等)根据我的经验,优化C代码最非传统的方式是对应用程序进行概要分析,识别性能缓慢的结构和/或db命中,然后使用大O分析围绕它们设计合理的解决方案。是典型的例子。很奇怪,Tom Duff承认,“这段代码在[关于案例陈述中失败的辩论

提高C代码性能的最非正统的方法是什么?这是不可阻挡的!一切都在进行,包括将循环结构更改为gotos、硬编码任何内容、以奇怪的方式使用case语句等。完全不用担心可维护性、可读性等


p、 这是很实用的。。。我很清楚如何以合理的方式提高代码的性能(改进算法、优化前进行概要分析等)

根据我的经验,优化C代码最非传统的方式是对应用程序进行概要分析,识别性能缓慢的结构和/或db命中,然后使用大O分析围绕它们设计合理的解决方案。

是典型的例子。很奇怪,Tom Duff承认,“这段代码在[关于案例陈述中失败的辩论]中形成了某种争论,但我不确定它是赞成还是反对。”

分析您的代码,找出慢点,并使用内联汇编优化它们。

&。

您正在寻找一种非正统的、无障碍的,但优化C的通用解决方案是什么

用汇编语言重写。循环展开。如果不实际循环,则每次迭代都会保存跳转、比较和增量。
2) 避免双重间接。执行该检索的算术运算通常更快,因此[y*height+x]通常比[y][x]快。加上尺寸为MxN的一维数组,与尺寸为MxN的矩形矩阵相比,可以节省M(或N)个字的指针。
3) 尽可能使用荒谬的部件优化。例如,在x86体系结构上,您可以使用BSWAP指令在一次操作中交换字节,而不是使用普通的
temp=a;a=b;b=温度模式

当然,别忘了:
4) 不要进行边界检查或错误处理


话虽如此,我还是要避免所有这些,除了(2)在实践中。

要快速计算逆平方根,必须有相当高的排名…

你的编译器在优化方面几乎肯定比你丑陋的尝试给你的要好。大多数历史上的小把戏现在都毫无意义了。忽视可读性和可维护性的人倾向于编写效率较低的代码,因为真正的优化变得更加困难

当代码已经以各种可能的方式进行了优化并且仍然需要性能提升时,在ASM中重写关键部分最有可能产生效果。

使用内联汇编

不过,说真的,如果仅仅通过更改C代码就可以提高性能,那么很可能您可以干净利落地做到这一点

少数例外情况:

1) 如果您对不同类型的指针依赖对齐语义,通常可以对指针执行块操作,从技术上讲,这些指针会使您的应用程序受到边界溢出条件的影响,但实际上不会,因为系统的对齐特性。因此,可以通过对齐初始字符执行内存复制,然后使用长*指针完成内部块

2) 如果您知道编译器分配局部变量的内存顺序,就有可能以巧妙的方式复制堆栈帧。这可能允许您实现该语言不支持的co例程。协程通常是实现某些类型的循环控制的一种更简单、更快的方法

3) 无论你如何使用工会,工会总是有点“黑”。这是一种通过相当松散的类型检查实现多态性的方法


4) 使用C预处理器作为自动生成代码的方法通常很难调试和读取。由于这些人倾向于避免这种情况。

在DSP应用程序中,仍然值得使用汇编语言来获得C编译器不太擅长的SIMD指令的最佳性能。但这并不是真正的“C”解决方案

我经常做的事情是使用曲线拟合软件将函数替换为计算速度更快的近似值。有时LUT仍然比进行大量计算快,但不像以前那样频繁。

参见本章,作者Abrash(约5页:单击每个屏幕底部的“下一步”)

总结(文章中的一些引用):

  • 表驱动魔术(巨大的查找表和不可思议的状态机)
  • 这是一种性能编程方法,其运行效率更高,集成度更高,您可能再也看不到了
  • 惊人的努力节约

对于C代码的性能,没有什么非正统的东西可以做了。所有有效的技术都已“矫正”

我发现最好的方法是使用能够访问CPU性能计数器的探查器,并特别注意缓存和分支未命中。尽可能添加缓存预取,尽可能删除不可预测的分支

不要为循环展开而烦恼。如果分支是可预测的,那么它几乎是免费的。让编译器来操心吧


在一些非常并行的体系结构(如IA64)上,可以更快地将循环展开到最后。其中一个例子是避免使用C字符串函数。使用memset将字符串数组归零,使用memcpy设置字符串,使用memcmp将整个数组与另一个类似数组进行比较。这可以使用64位加载,不必检查零终止符,如果使用64或128的“小”数组大小,可以优化为根本不循环或分支。memxxx()函数通常是编译器内置的,并且经过了非常优化。

我听到很多答案是“尝试执行X、Y或Z”,但这就像说“听,吃一条鱼,好好吃一天”

我宁愿教你如何寻找性能问题。说“个人资料优先”的人是正确的,但是(IMHO)太胆小了

这将教你钓鱼,告诉你如何找到鱼的位置和大小。一旦 int = 3, y = 4; x = x ^ y; y = y ^ x; x = x ^ y;