无心人 发表于 2009-2-18 16:58:59

另外,你能否对105#的修改进行测试
和你原来的比较下

Mgccl 发表于 2009-3-4 08:17:39

gxqcn...我将你的代码借用一下?

gxqcn 发表于 2009-3-4 20:00:00

尽管拿去用!

无须声明,且可自修订;
若有改进请告诉我一声。:) :handshake

llxxtnt 发表于 2009-3-28 15:32:27

提高程序的性能,主要应该依赖于高效的算法
而不是在于更先进的编程工具,更快的编程语言,更高明的编程技巧
这些都应该只是次要的手段
我看到很多人都在讨论如何使用更先进的汇编指令来完成高效的计算,是不是走入了误区
我用16#的算法,写了一个C程序,如果不打印结果,性能还不错
//这个程序计算从1到0xFFFFFFFF的所有数的平方根,并全部打印
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char** argv)
{
    register unsigned int num = 1;
    register unsigned int root = 1;
    register unsigned int square = 0;


    for( ; ; root++)
    {
      square += root << 1;
      square--;

      for( ; ; )
      {
            if(num == square)
            {
#ifdef __DEBUG__
                printf("square root of %d is %d\n", num, root);
#endif
                num++;
                break;
            }

#ifdef __DEBUG__                        
            printf("square root of %d is %d\n", num, root-1);
#endif                        
            num++;

            if(num == 0xFFFFFFFF)
            {
                return 0;
            }
      }
    }

    return 0;
}

mathe 发表于 2009-3-28 15:38:27

你做的不是同一件事情.

无心人 发表于 2009-3-28 19:09:43

你是枚举每一个的平方根
那个是不用乘除法的

我们是随机数字的平方根
如果你有兴趣

请考虑下
求2^48-- 2^64 - 1
下任意一个数字的平方根
你看你如何求?

你就知道其中区别了

G-Spider 发表于 2011-4-6 18:44:01

看到这个代码,我满意地笑了。#include <stdio.h>

_declspec(naked) float fast_sqrt(float x)
{
_asm
    {
      sub esp,4
      mov eax,
      sub eax,0x3f800000
      sar eax,1
      add eax,0x3f800000
      mov ,eax
      fld dword ptr
      add esp,4
      ret
    }
}

int main()
{
    float i;
    for(i=0.0;i<=16.0;i+=0.2)   //test
      printf("%f    %f\n",i,fast_sqrt(i));
   
    return 0;

}

liangbch 发表于 2011-4-7 01:02:28

在137#的基础上,封装一个和参考函数接口完全相同的函数iSqt_FPU1_gspider。使用70#的源代码进行测试,发现这个函数的速度不太理想。

测试平台:
core2, 4G,windows XP,VC6.0 release 方式编译typedef unsigned long DWORD;
_declspec(naked)
float gspider_fast_sqrt(float x)
{
_asm
{
      sub esp,4
      mov eax,
      sub eax,0x3f800000
      sar eax,1
      add eax,0x3f800000
      mov ,eax
      fld dword ptr
      add esp,4
      ret
    }
}

DWORD __fastcall iSqrt_FPU1_gspider(DWORD n)
{
        float x=(float)n;
        return (DWORD)(gspider_fast_sqrt(x));
}


n: 0-0x10000
iSqt_ref#: 0.00106 s
iSqt_c1_lbc#: 0.00033 s
iSqt_c2_lbc#: 0.00064 s
iSqt_FPU1_lbc#: 0.00039 s
iSqt_FPU2_lbc#: 0.00040 s
iSqt_FPU3_lbc#: 0.00078 s
iSqt_FPU_yaos#: 0.00112 s
iSqt_FPU2_yaos#: 0.00046 s
iSqt_gxq_c#: 0.00073 s
iSqt_GxQ_asm#: 0.00259 s
iSqt_16#: 0.00356 s
iSqt_FPU1_gspider#: 0.00160 s


n: 0-0x10000000
iSqt_ref#: 4.78258 s
iSqt_c1_lbc#: 1.90706 s
iSqt_c2_lbc#: 4.69837 s
iSqt_FPU2_lbc#: 1.80180 s
iSqt_FPU3_lbc#: 3.52315 s
iSqt_FPU_yaos#: 5.06165 s
iSqt_FPU1_yaos#: 5.06292 s
iSqt_FPU2_yaos#: 2.07291 s
iSqt_gxq_c#: 3.13477 s
iSqt_GxQ_asm#: 11.72902 s
iSqt_16#: 16.66489 s
iSqt_FPU1_gspider#: 7.45803 s

G-Spider 发表于 2011-4-7 12:15:16

138# liangbch
原理也是适用于float型的粗糙开方。经过两次强制类型转换,再多了一次调用,会慢下来。

G-Spider 发表于 2011-4-17 21:39:03

也来一个FPU版,差不多的性能。char b80={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\
            0,0,0,0,0,0,0,0x80,0x1f,0x40,0,0,0,0,0,0};
            
__declspec(naked)
DWORD __fastcall fast_sqrt(DWORD n)
{
        __asm
        {
                  push   ecx
                        shr    ecx, 27
                        and    ecx, 16
                        fld    tbyte ptr
                        fild   dword ptr
                        faddpst(1),st
                        fsqrt
                       
            fisttp dword ptr
            pop    eax
                        ret
        }
}
页: 4 5 6 7 8 9 10 11 12 13 [14] 15
查看完整版本: 二进制32位整数快速平方根