【发布时间】:2023-03-22 09:55:01
【问题描述】:
int *s;
allocate memory for s[100];
void func (int *a, int *b)
{
int i;
for (i = 0; i < 100; i++)
{
s[i] = a[i] ^ b[i];
}
}
假设这个特定的代码 sn-p 被调用了 1000 次,这是我的代码中最耗时的操作。还假设a和b的地址每次都改变。 's' 是一个全局变量,它使用不同的 a & b 值集进行更新。
据我推测,主要的性能瓶颈是内存访问,因为唯一的其他操作是 XOR,这是非常微不足道的。
您能否建议我如何以最佳方式优化我的代码?
我真正想问的问题,但我认为它没有得到正确传达,例如,这个 for 循环包含 10 个这样的 XOR 操作,循环计数为 100,函数被调用 1000 次,重点是高内存访问..如果代码要在单核机器上执行,有哪些改进空间?
【问题讨论】:
-
您确定瓶颈不是由于分配内存造成的吗? malloc 涉及定期调用操作系统中昂贵的内存分配代码。例如:在 unix 中调用是 brk()。
-
这个函数需要线程安全吗?
-
什么是
s?为什么是本地的?如果函数只是填满一个本地数组,它实际上并没有做任何事情,所以优化它的最佳方法是完全删除它。为什么你的函数int没有返回任何东西?你用这个干什么?您需要向我们提供更多信息。 -
这个函数很奇怪。它计算
s,它被立即丢弃并且分配的内存泄漏。因此,最好的优化可能是int func(int *a, int *b) { (void)a; (void)b; } -
您必须提供有关调用函数的更多信息。某些 a 和 b 数组是否重复?当涉及到内存瓶颈时,您确实需要考虑整个访问模式,而不仅仅是 100 个元素的小循环。在稍高的级别重新排序内存访问可能会对性能产生巨大影响,具体取决于发生的情况。
标签: c optimization