| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3835 人关注过本帖, 1 人收藏
标题:switch语句问题
只看楼主 加入收藏
cosdos
Rank: 9Rank: 9Rank: 9
来 自:ShangHai
等 级:蜘蛛侠
威 望:6
帖 子:2109
专家分:1385
注 册:2007-6-19
收藏
得分:0 
达夫设备的主要思想是使用 寄存器来进行计数 和 减少循环 来提高速度,非常实用的技巧。寄存器变量用汇编可能更好些(C未必会使用寄存器来计数)。

    现在的内存比以前快非常多了,在以前内存是很慢的,所以使用寄存器在速度上能提高很多,减少循环也是提高速度的一种优化。

    在现在的计算机上这个已经不能明显的体现出来了。

[[it] 本帖最后由 cosdos 于 2008-7-4 20:45 编辑 [/it]]

—>〉Sun〈<—
2008-07-04 20:44
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
[bo][un]RockCarry[/un] 在 2008-7-4 20:35 的发言:[/bo]
这样做巧妙的减少了剩余数据拷贝时,所做的循环判断,因此其效率会比上面的算法快,然而这样的性能提升其实是微不足道的,而且这样的代码也不适合用于工程上。更加关键的是,这段代码的实际效率很大程度的依赖于编译器对 switch 语句的编译和优化处理。


估计我说因为代码封装的缘故,底层实现对整体的工程的影响不大,R版也不会听了……算了……不过不知道R版有没有自己设计软件架构。内部的实现,和架构的相容性与否,不是代码是否投机取巧决定的,只能说这段代码在看不懂的人眼里更难调试而已。那是团队整体素质决定的,R版自降身份我也没话可说。

不过对于现代计算机,达夫设备的确不明显了,不过却决不是因为什么“编译和优化的处理”(因为达夫设备完全符合C标准,编译器没理由刁难),而是因为现代计算机的内存速度不再像以前那么缓慢了。

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-07-04 20:57
cosdos
Rank: 9Rank: 9Rank: 9
来 自:ShangHai
等 级:蜘蛛侠
威 望:6
帖 子:2109
专家分:1385
注 册:2007-6-19
收藏
得分:0 
达夫设备作为一个函数,不存在工程上的问题,函数有专人编写,有问题就找那个人。

—>〉Sun〈<—
2008-07-04 21:09
RockCarry
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:13
帖 子:662
专家分:58
注 册:2005-8-5
收藏
得分:0 
// 当然,如果还不懂的话,我们可以这样理解
void fastcopy(BYTE *pdest, BYTE *psrc, long count)
{
    int n;
    int m;

    m = count % 8;
    if (m == 0) goto jump0;
    else if (m == 1) goto jump1;
    else if (m == 2) goto jump2;
    else if (m == 3) goto jump3;
    else if (m == 4) goto jump4;
    else if (m == 5) goto jump5;
    else if (m == 6) goto jump6;
    else if (m == 7) goto jump7;

    n = (count + 7) / 8;
    do
    {
jump0:  *pdest++ = *psrc++;
jump7:  *pdest++ = *psrc++;
jump6:  *pdest++ = *psrc++;
jump5:  *pdest++ = *psrc++;
jump4:  *pdest++ = *psrc++;
jump3:  *pdest++ = *psrc++;
jump2:  *pdest++ = *psrc++;
jump1:  *pdest++ = *psrc++;
    } while (--n > 0);
}

如果不考虑代码的效率,而仅从功能的角度上讲,这里的一组 if 语句,与 Duff's Device 中的 switch 语句具有相同的功能。如果考虑编译器的优化,那么 Duff's Device 的效率会更加高一些。然而,在实际中,是不存在理想化的 switch 语句的,所谓的跳准表优化,其实是很难用到 switch 语句上的,switch 的是一个 int 型的整数,如果使用直接的跳转表,在极端情况下编译器有可能需要为一个 switch 语句去维护一个拥有 4G 个表项的直接跳转表,这显然是无法做到的。因此,编译器会采用维护间接跳转表来达到目的,不管何种形式的间接跳转表,消耗在查表上的开销,也很难说就比 if 语句来得少。聪明的编译器,也许会根据 switch 中 case 语句的情况,来采取不同的跳转表策略,并产生优化的代码。而另外一些编译器,则干脆就简单的将 switch 语句编译成为与 if 语句组等同的代码。
2008-07-04 21:19
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
[bo][un]RockCarry[/un] 在 2008-7-4 21:19 的发言:[/bo]
而另外一些编译器,则干脆就简单的将 switch 语句编译成为与 if 语句组等同的代码。


你觉得在21世纪的今天,这种编译器还存在么?

不管怎么说,达夫设备是作为标准化对于switch的定义的一个佐证存在的。其实际意义,在于新颖的算法设计。而不是实际应用,实际上,现代编译器根本是可以自行展开这种循环的。我反编译过VC9和minGW3.4.5的代码,都进行了这种优化。

注意其现实意义,而不是本身的价值。这是我提出达夫设备的本质原因。其优化方法,自然不如直接嵌入汇编。但是直接嵌入汇编,也只不过是达夫设备汇编下的实现,其中心思想是不会改变的。

还有就是,一般编译器都会用间接跳转表的,没有哪个编译器聪明到对顺序元素使用直接跳转表,也没有哪个编译器笨到直接将switch当作连续if串——稍微有优化器的编译器都不会做这种傻事……

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-07-04 21:26
RockCarry
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:13
帖 子:662
专家分:58
注 册:2005-8-5
收藏
得分:0 
这样的函数当然可以用,但是许多时候效率并不是特别重要,我说工程上不适合,是从代码的可读性这个角度上考虑的。如果我在自己的程序中写这样的代码,也许明天就有人跑来问我这个是什么意思,然后我会解释半天,也许这样做会显得自己很神奇,很厉害,但是却是在一定程度上浪费了时间。

至于问我有没有做过软件,有没有设计架构,我不想回答,有些话说出来不好听,特别是对你,我觉得很难跟你讨论,所以我也不多说了。
2008-07-04 21:27
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
诸如就是“我在XXX的时候,你还在YYY吧”之类的话吧。不说我也知道。
每想到R版这么记仇啊~~~~

这样的函数我也不会用的,所以才说“其现实意义不是在于实际上的使用”,但是,你不能否认其设计的精巧。

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-07-04 21:31
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
当然,如果是我一个人写的程序,我自然会用一用的,如果是Freeware的话,自然也没用不用的理由。

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-07-04 21:32
RockCarry
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:13
帖 子:662
专家分:58
注 册:2005-8-5
收藏
得分:0 
有句话我真的想说了,我很怀疑你的心理是否健康,对你这人,真是没有话说了,总是挑起战争。
2008-07-04 21:37
cosdos
Rank: 9Rank: 9Rank: 9
来 自:ShangHai
等 级:蜘蛛侠
威 望:6
帖 子:2109
专家分:1385
注 册:2007-6-19
收藏
得分:0 


C语言是一个灵活自由的语言,用不用是程序员的事。

—>〉Sun〈<—
2008-07-04 21:38
快速回复:switch语句问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.029567 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved