Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3676857
  • 博文数量: 146
  • 博客积分: 3918
  • 博客等级: 少校
  • 技术积分: 8582
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-17 13:52
个人简介

个人微薄: weibo.com/manuscola

文章分类

全部博文(146)

文章存档

2016年(3)

2015年(2)

2014年(5)

2013年(42)

2012年(31)

2011年(58)

2010年(5)

分类: C/C++

2011-08-27 17:47:06

    前文讲过了连续事件号的switch 语句的跳转,核心的思想,就是跳转表,通过和第一个事件的偏移量,来定位跳转表的index,根据跳转表中的地址,跳转到相应的处理函数。

    对于非连续的事件号,switch 语句的跳转要复杂,本质根据二叉搜索来定位跳转的地址。下面详细叙述。

  1. typedef enum OPCODE{
  2.     EVENT1 = 1000,
  3.     EVENT2,
  4.     EVENT3,
  5.     EVENT4 = 2000,
  6.     EVENT5,
  7.     EVENT6,
  8.     EVENT7 =20000,
  9.     EVENT8,
  10.     EVENT9,
  11.     EVENT10 = 30000,
  12.     EVENT11,
  13.     EVENT12,
  14.     EVENT13 = 40000,
  15.     EVENT14,
  16.     EVENT15,
  17.     EVENT16,
  18. }OpCode;
   第一条判断是0x4e21 = 20001,EVENT8.

  1.  80484fd:    3d 21 4e 00 00     cmp $0x4e21,%eax
  2.  8048502:    0f 84 e1 00 00 00  je 80485e9 <test_switch+0xf5>
  3.  ......
  4.  80485e9:    e8 ac fe ff ff     call 804849a <do_event8>

   事件号如果比 20001大,则跳转去和0x7532 = 30002去比较,事件号EVENT12
  1. 8048508: 3d 21 4e 00 00         cmp $0x4e21,%eax
  2. 804850d: 7f 56                  jg 8048565
  3. ....
  4. 8048565: 3d 32 75 00 00         cmp $0x7532,%eax
   反之,如果事件号比20001小,则和0x7d0=2000,EVENT4 比较。
  1. 804850f: 3d d0 07 00 00         cmp $0x7d0,%eax
  2. 8048514: 0f 84 b3 00 00 00      je 80485cd
  3. ........ 
  4. 80485cd: e8 a0 fe ff ff         call 8048472

    OK 剩下的事情我不说,大家也都明白了,就是一个二分查找的过程。 我们可以想见,EVENT8 处理的最快,EVENT4 和EVENT12 次之,EVENT1和EVENT16因为在边界,所以需要判断好多次才能走到,他们处理的比较慢。下面做个实验 
 
  1. const int event_good_array[3] = {EVENT8,EVENT12,EVENT4};
  2. const int event_bad_array[3] = {EVENT1,EVENT16,EVENT9};

  3. ...........

  for(i = 0;i
  {
                event = event_bad_array[rand()%3];
                test_switch(event);
  }

    我们推测,每次随机从好数组选择事件号执行的速度要优于每次从差数组里面选择事件号。做了一组实验,证明的确如此。
  1. 100000000 times of switch cost 8108847 us
  2. 100000000 times of switch cost 8109346 us
  3. 100000000 times of switch cost 8113334 us
  4. 100000000 times of switch cost 8101369 us
  5. 100000000 times of switch cost 8107485 us
  6. ------------------------------------------------

  7. 100000000 times of switch cost 7871112 us
  8. 100000000 times of switch cost 7862668 us
  9. 100000000 times of switch cost 7858855 us
  10. 100000000 times of switch cost 8033684 us
  11. 100000000 times of switch cost 7858253 us
    本文用实验证明了 按照概率的大小安排switch 语句中的case是没有道理的,起码对于非连续的事件号,是没有道理的。 

阅读(2885) | 评论(3) | 转发(0) |
给主人留下些什么吧!~~

GFree_Wind2011-10-11 12:13:06

顶之~~~

Bean_lee2011-08-29 20:42:16

匿名: 楼主用的什么编译器?我在VC下release版本测试差别不大。.....
GCC.

2011-08-29 16:08:35

楼主用的什么编译器?我在VC下release版本测试差别不大。