我有一个关于优化的练习。我需要优化旋转和成像45度的程序。我知道使用指针访问数组效率更高,所以我尝试了下面的更改 - 原始代码:
RGB* nrgb = (RGB *)malloc(imgSizeXY*3);//3=sizeof(RGB)
//...
for (i=imgSizeY-1; i>=0; --i)
{
for (j=imgSizeX-1; j>=0; --j)
{
//...
int y=(i*imgSizeX+j);
nrgb[y].r = *imgInd; //*imgInd computed earlier
变化:
RGB* nrgb = (RGB *)malloc(imgSizeXY*3);//3=sizeof(RGB)
RGB* rgbInd = nrgb+imgSizeXY-1;
for (i=imgSizeY-1; i>=0; --i)
{
for (j=imgSizeX-1; j>=0; --j)
{
rgbInd->r=*imgInd;
--rgbInd;
但是当使用指针时,程序会产生错误的输出。我已经盯着它看了几个小时,但仍然不知道为什么。有任何想法吗?非常感谢你!
答案 0 :(得分:2)
指针访问数组元素和索引访问之间没有区别。你可以看到,如果生成汇编代码。索引更加简单。
答案 1 :(得分:0)
L1缓存命中比L2缓存命中快一个数量级,L2缓存命中本身比主存储器访问快一个数量级。见Numbers Every Computer Scientist Should Know。对于图像操作,您希望自己必须进行大量的内存读写操作,因此在优化代码时,您应该主要关注缓存效率。
因此,专注于寻找更有效地使用缓存的方法,并且不要太担心编译器没有优化优化简单的指针算法。