免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: Go_To_CU
打印 上一主题 下一主题

如何提高查找速度 [复制链接]

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
31 [报告]
发表于 2005-09-18 13:30 |只看该作者

如何提高查找速度

原帖由 "mik" 发表:



如果,确定数组较大的。那么可以按 6 bytes 查、8 bytes

甚至更多。。。

这样是否更快。


我想不是这样的... 32位机来说 按4bytes 应该是最快的. 个人理解.如不对请指教.

论坛徽章:
0
32 [报告]
发表于 2005-09-18 13:40 |只看该作者

如何提高查找速度

原帖由 "mq110" 发表:


我想不是这样的... 32位机来说 按4bytes 应该是最快的. 个人理解.如不对请指教.



但是,按 8 bytes 来查,明明是比 4 bytes 省了一半的时间嘛。

而且,在 gcc 中,编译器缺省对齐是 16 bytes 上。

  1. andl $-16, esp
复制代码

论坛徽章:
0
33 [报告]
发表于 2005-09-18 13:49 |只看该作者

如何提高查找速度

[quote]原帖由 "mik"]但是,按 8 bytes 来查,明明是比 4 bytes 省了一半的时间嘛。 [/quote 发表:


你在32位的机器上去判断一个64位的区域是否为空,请问你是如何
“比 4 bytes 省了一半的时间嘛”? :wink:

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
34 [报告]
发表于 2005-09-18 13:54 |只看该作者

如何提高查找速度

同时处理32位2进制数. 怎么会8bytes 比4bytes 节省一半时间???不解.

论坛徽章:
0
35 [报告]
发表于 2005-09-18 14:26 |只看该作者

如何提高查找速度

原帖由 "雨丝风片" 发表:


你在32位的机器上去判断一个64位的区域是否为空,请问你是如何
“比 4 bytes 省了一半的时间嘛”? :wink:



嘿~~~

int main()
{
     int a[] = { 0, 1};
     int *p = a;

     if (*(long long*)p)
        printf("long long size is %d,%d\n"  a[1]);

     *(long long*)p = 0;
    if (!*(long long*)p)
        printf("long long size is %d,%d\n" a[1]);

    return 0;

}


你们试一试,结果如何??? 

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
36 [报告]
发表于 2005-09-18 14:30 |只看该作者

如何提高查找速度

这能说明效率问题?

论坛徽章:
0
37 [报告]
发表于 2005-09-18 14:47 |只看该作者

如何提高查找速度

[quote]原帖由 "mq110"]这能说明效率问题?[/quote 发表:

  1. int main()
  2. {
  3.       int a[] = { 0, 1 };
  4.       int *p = a;

  5.      *p = 0;
  6.      *(p+1) = 0;
  7.   
  8.      if ( !*p && !*(p+1))
  9.          printf("%d\n",a[1]);
  10. }
复制代码

gcc 3.3.1 编译为:

  1.         leal        -8(%ebp), %eax
  2.         movl        %eax, -12(%ebp)
  3.         movl        -12(%ebp), %eax
  4.         movl        $0, (%eax)
  5.         movl        -12(%ebp), %eax
  6.         addl        $4, %eax
  7.         movl        $0, (%eax)
  8.         movl        -12(%ebp), %eax
  9.         cmpl        $0, (%eax)
  10.         jne        .L2
  11.         movl        -12(%ebp), %eax
  12.         addl        $4, %eax
  13.         cmpl        $0, (%eax)
  14.         jne        .L2
  15.         movl        -4(%ebp), %eax
  16.         movl        %eax, 4(%esp)
  17.         movl        $.LC0, (%esp)
  18.         call        printf
  19. .L2:
  20.         movl        $0, %eax
  21.         leave
复制代码



而:
  1. int main()
  2. {
  3.     int a[] = { 0, 1};
  4.     int *p = a;

  5.      *(long long*)p = 0;
  6.    if (!*(long long*)p)
  7.        printf("long long size is %d,%d\n" a[1]);

  8.    return 0;
  9. }
复制代码

gcc 3.3.1编译为:
  1.         leal        -8(%ebp), %eax
  2.         movl        %eax, -12(%ebp)
  3.         movl        -12(%ebp), %eax
  4.         movl        $0, (%eax)
  5.         movl        $0, 4(%eax)
  6.         movl        -12(%ebp), %eax
  7.         cmpl        $0, (%eax)
  8.         jne        .L2
  9.         movl        -4(%ebp), %eax
  10.         movl        %eax, 4(%esp)
  11.         movl        $.LC0, (%esp)
  12.         call        printf
  13. .L2:
  14.         movl        $0, %eax
  15.         leave
复制代码



用事实说话,不用解释了,对比一下:)

不过是未在优化编译的。 不知优化编译后,是否一样。。。

论坛徽章:
0
38 [报告]
发表于 2005-09-18 15:00 |只看该作者

如何提高查找速度

将两段代码用优化 -O 编译了。

产生代码是差不多。

:)

论坛徽章:
0
39 [报告]
发表于 2005-09-18 21:35 |只看该作者

如何提高查找速度

原帖由 "mik" 发表:


用事实说话,不用解释了,对比一下:)

不过是未在优化编译的。 不知优化编译后,是否一样。。。

  1. int main()
  2. {
  3.    int a[] = { 0, 1};
  4.    int *p = a;

  5.     *(long long*)p = 0;
  6.   if (!*(long long*)p)
  7.       printf("long long size is %d,%d\n" a[1]);

  8.   return 0;
  9. }
复制代码



这段汇编是 gcc 生成的吗?

  1.    leal   -8(%ebp), %eax            
  2.    movl   %eax, -12(%ebp)          # p = a
  3.    movl   -12(%ebp), %eax         
  4.    movl   $0, (%eax)
  5.    movl   $0, 4(%eax)              # *(long long *)p = 0
  6.    movl   -12(%ebp), %eax          # eax <-- p, or a
  7.    cmpl   $0, (%eax)               # a[0] == 0   ??? where is a[1]
  8.    jne   .L2
  9.    movl   -4(%ebp), %eax
  10.    movl   %eax, 4(%esp)
  11.    movl   $.LC0, (%esp)
  12.    call   printf
  13. .L2:
  14.    movl   $0, %eax
  15.    leave
复制代码

论坛徽章:
0
40 [报告]
发表于 2005-09-18 21:43 |只看该作者

如何提高查找速度

同样的c代码(虽然没看明白你在干什么),gcc 3.3.5 生成:

  1. main:
  2.         pushl   %ebp
  3.         movl    %esp, %ebp
  4.         subl    $24, %esp
  5.         andl    $-16, %esp
  6.         movl    $0, %eax
  7.         subl    %eax, %esp
  8.         movl    $0, -8(%ebp)
  9.         movl    $1, -4(%ebp)
  10.         leal    -8(%ebp), %eax
  11.         movl    %eax, -12(%ebp)
  12.         movl    -12(%ebp), %edx
  13.         movl    (%edx), %eax             # eax <-- a
  14.         orl     4(%edx), %eax            # eax <-- a[0] | a[1]
  15.         testl   %eax, %eax
  16.         jne     .L2
  17.         movl    -4(%ebp), %eax
  18.         movl    %eax, 4(%esp)
  19.         movl    $.LC0, (%esp)
  20.         call    printf
  21. .L2:
  22.         movl    $0, %eax
  23.         leave
  24.         ret
复制代码


a[1] 和 a[2] 都处理了。

关键是如何处理这个逻辑表达式
  1. (!*(long long*)p)
复制代码

!a 应该把 a 转换为 int 还是......

不清楚标准上是怎么写的。

ps>; 我好象又记起了一些东西

如果 typeof(a) 是 long long, 那么 !a 被转换为 !(a==0), long long 与long long 的比较。所以不处理 a[1] 的代码是错误的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP