Objective c x*x与表_/sqr[x]=无差异?

Objective c x*x与表_/sqr[x]=无差异?,objective-c,iphone,Objective C,Iphone,我正在使用Xcode4和官方SDK为iPhone编写繁重的图像处理算法。我需要在我的代码中多次计算平方,总是针对无符号字符x。因此,为了加快速度,我声明了一个表: int table[255] = {0, 1, 4, 9,... }; 而不是 int sqr = x * x; 我从那个表中得到了值 int sqr = table[ABS(x)]; 不幸的是,当我在iPhone simulator中评测我的应用程序时,它告诉我这一行(从表中获取值)占用了50%以上的应用程序执行时间,因此与任

我正在使用Xcode4和官方SDK为iPhone编写繁重的图像处理算法。我需要在我的代码中多次计算平方,总是针对无符号字符x。因此,为了加快速度,我声明了一个表:

int table[255] = {0, 1, 4, 9,... };
而不是

int sqr = x * x;
我从那个表中得到了值

int sqr = table[ABS(x)];

不幸的是,当我在iPhone simulator中评测我的应用程序时,它告诉我这一行(从表中获取值)占用了50%以上的应用程序执行时间,因此与任何时候的计算
sqr
相比,这并不是一个大的改进。我做错了什么?它应该快得多,但我可能错了,我是这个编程环境的初学者。

首先,你不是在计算平方根,你只是在计算平方,这是一个非常便宜的操作。其次,如果编译器不善于缓存或常量传播,那么内存查找通常比平方运算更昂贵


您最初为什么选择优化该行?您是否分析并确定旧的操作方法不够高效/快速?

首先,您不是在计算平方根,而是在计算平方,这是一种非常便宜的操作。其次,如果编译器不善于缓存或常量传播,那么内存查找通常比平方运算更昂贵


您最初为什么选择优化该行?您是否分析并确定旧的操作方式效率/速度不够高?

可能速度不够快。大多数CPU都有一个整数相乘的单周期操作,其中数组查找意味着一个操作需要执行更慢的内存访问。

它可能不会更快。大多数CPU都有一个整数相乘的单周期操作,其中数组查找意味着需要执行更慢的内存访问操作。

Xcode可以显示Asm。查看生成的汇编语言代码,您很可能会发现abs和索引数组访问需要比简单乘法多几个ARM指令。

Xcode可以显示Asm。查看生成的汇编语言代码,您很可能会发现abs和索引数组访问需要比简单乘法多几个ARM指令。

将所有平方根替换为平方。将所有平方根替换为平方。是的,我正在计算平方,就像我之前所说的。这是我试图计算的唯一例子。在我的代码中,我计算了一个稍微复杂一点的方程:s=(x/3)*^2,对于-765和765之间的x。我必须做很多次,分析器告诉我这需要很多时间来执行。所以我决定声明一个表,其中x的预计算值在0到765之间。是的,我在计算平方,就像我之前说过的。这是我试图计算的唯一例子。在我的代码中,我计算了一个稍微复杂一点的方程:s=(x/3)*^2,对于-765和765之间的x。我必须做很多次,分析器告诉我这需要很多时间来执行。所以我决定声明一个表,其中x的预计算值在0到765之间。不幸的是,我不太适合阅读汇编代码,甚至不适合对汇编代码进行反向工程。但是我已经用if((x>>31)=-0x01){…-1*x…}或者{…-x…}替换了ABS()指令。不幸的是,我不太擅长阅读甚至是反向工程汇编代码。但是我已经用if((x>>31)=-0x01){…-1*x…}替换了ABS()指令,否则{…x…}目前我的修改使这个等式的执行时间缩短了5%。但这并不是一个巨大的进步。我在很多书中读到,甚至在stackoverflow上,准备一个带有预计算值的表是提高“SQRT”速度的好方法。目前我的修改使这个等式的执行时间缩短了5%。但这并不是一个巨大的进步。我在很多书中读到,甚至在stackoverflow上,准备一个带有预计算值的表是加快“SQRT”速度的好方法。