c - 通过计算复制 C 数组的更快方法

标签 c arrays performance memory-management copy

我想将一个 C 数组数据复制到另一个,但在两者之间进行计算(即不仅仅是将相同的内容从一个复制到另一个,而是对数据进行修改):

int aaa;
int src[ARRAY_SIZE];
int dest[ARRAY_SIZE];

//fill src with data

for (aaa = 0; aaa < ARRAY_SIZE; aaa++)
{
    dest[aaa] = src[aaa] * 30;
}

这是在大小为 520 或更大的缓冲区中完成的,因此 for 循环相当可观。

有什么方法可以提高编码方面的性能吗?

我对这个主题做了一些研究,但我找不到关于这种情况的任何具体信息,只有关于简单的缓冲区到缓冲区的复制(示例:hereherehere)。

环境:GCC for ARM 使用嵌入式 Linux。不过,上面的特定代码是在一个 C 项目中使用的,该项目在专用处理器中运行,用于 DSP 计算。通用处理器为OMAP L138(DSP处理器包含在L138中)。

最佳答案

您可以尝试循环展开或 duff 设备等技术,但如果您打开编译器优化,它可能会在任何情况下为您执行此操作,前提是它对您有利且不会使您的代码不可读。

依赖编译器优化的优势在于它是架构特定的;适用于一个目标的源代码级技术可能不适用于另一个目标,但编译器生成的优化将特定于目标。例如,无法在 C 中专门针对 SIMD 指令进行编码,但编译器可能会生成代码来利用它们,为此,最好保持代码简单直接,以便编译器可以识别惯用语.编写奇怪的代码来“手动优化”可能会打败优化器并停止其工作。

另一种可能对某些目标有利的可能性(如果您只为桌面 x86 目标编码,这可能无关紧要),是通过使用移位来避免乘法指令:

鉴于 x * 30 等价于 x * 32 - x * 2,循环中的表达式可以替换为:

input[aaa] = (output[aaa] << 5) - (output[aaa] << 1) ;

但是优化器很可能会为你做这件事;它还将避免 output[aaa] 的重复计算,但如果不是这种情况,以下内容可能会有所帮助:

int i = output[aaa] ;
input[aaa] = (i << 5) - (i << 1) ;

移位技术可能更适合除法运算,因为除法运算在大多数目标上的开销要大得多,而且它仅适用于常量

这些技术可能会提高未优化代码的性能,但编译器优化可能会做得更好,并且原始代码可能比“手动优化”代码优化得更好。

最后,如果它很重要,您必须进行试验并执行时序测试或分析。

关于c - 通过计算复制 C 数组的更快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27554068/

相关文章:

sql - Oracle慢RANK函数

performance - typescript 遍历键入的对象键

c - c 中的美元找零程序

c - 通过打开和读取来检测可用设备

c - Motif 编程和 UTF-8

c - C 中的重复 GtkWidget

arrays - 字符串的排列不适用于整数数组

ruby - 在 Ruby 中比较序列

java - 如何将字符串数组添加到数组列表

c# - 测试性能