3 测试性能(harib10c~harib10f)

从昨天开始,我们就在不断地对定时器进行改善,而且以后还要继续改善,但我们不能总是自我满足呀,我们要亲自感受一下到底改善到什么程度了。所以我们要测试性能。

我们之所以如此专注于定时器的改良,理由很简单,是因为在今后的开发中会经常使用定时器。经常使用的东西当然要做好。同理,我们也努力地改进了图层控制程序。

测试性能的方法很简单:先对HariMain略加修改,恢复变量count,然后完全不显示计数,全力执行“count++;”语句。当到了10秒后超时的时候,再显示这个count值。程序所做的只有这么多。可是需要注意,必须在起动3秒后把count复位为0一次。为什么要这样做呢?我们在后面的专栏里说明。

本次的HariMain节选

  1. int mx, my, i, count = 0;
  2. (中略)
  3. for (;;) {
  4. count++; /* 这里! */
  5. io_cli();
  6. if (fifo8_status(&keyfifo) + fifo8_status(&mousefifo) + fifo8_status(&timerfifo) == 0) {
  7. io_sti();
  8. } else {
  9. if (fifo8_status(&keyfifo) != 0) {
  10. (中略)
  11. } else if (fifo8_status(&mousefifo) != 0) {
  12. (中略)
  13. } else if (fifo8_status(&timerfifo) != 0) {
  14. i = fifo8_get(&timerfifo); /* 超时的是哪个呢? */
  15. io_sti();
  16. if (i == 10) {
  17. putfonts8_asc_sht(sht_back, 0, 64, COL8_FFFFFF, COL8_008484, "10[sec]", 7);
  18. sprintf(s, "%010d", count); /* 这里! */
  19. putfonts8_asc_sht(sht_win, 40, 28, COL8_000000, COL8_C6C6C6, s, 10); /* 这里! */
  20. } else if (i == 3) {
  21. putfonts8_asc_sht(sht_back, 0, 80, COL8_FFFFFF, COL8_008484, "3[sec]", 6);
  22. count = 0; /* 开始测定 */
  23. } else {
  24. /* 0还是1 */
  25. if (i != 0) {
  26. timer_init(timer3, &timerfifo, 0); /* 下面是设定为0 */
  27. boxfill8(buf_back, binfo->scrnx, COL8_FFFFFF, 8, 96, 15, 111);
  28. } else {
  29. timer_init(timer3, &timerfifo, 1); /* 下面是设定为1 */
  30. boxfill8(buf_back, binfo->scrnx, COL8_008484, 8, 96, 15, 111);
  31. }
  32. timer_settime(timer3, 50);
  33. sheet_refresh(sht_back, 8, 96, 16, 112);
  34. }
  35. }
  36. }
  37. }

■■■■■

我们先执行一下这段程序吧。运行“make run”。

3 测试性能(harib10c~harib10f) - 图1

在笔者的环境中执行haribl10c

像这样,10秒钟结果就出来了。大家试着运行几次“make run”,会发现每次结果都不同。我们运行了5次。在测试期间的10秒钟内,不要动鼠标也不要按键。如果动鼠标或按键了,程序就不得不进行光标的显示处理,这样会减缓count的增长。

用“make run”运行5次harib10c的结果

  1. 0002638668
  2. 0002639649
  3. 0002638944
  4. 0002648179
  5. 0002637604

5次结果是如此发散,是由于使用模拟器而受到了Windows的影响。5次结果中,最大值与最小值的差有10575之大。因此我们在真机上也执行“make install”1看看。

1 在真机上也进行了测试:笔者用的真机是“AMD Duron 800MHz,内存为192MB”的组装机。

用真机执行5次harib10c的结果

  1. 0074643522
  2. 0074643698
  3. 0074643532
  4. 0074643699
  5. 0074643524

靠按复位按钮完成多次起动,的确很麻烦,我们只做了5次。得到的数值收敛得很好,最大值和最小值的差只有177。果然还是真机好呀。虽然用了真机,可还是出现了177的误差,其原因在于电脑内部的温度変化,或时钟频率的微妙変化。

■■■■■

下面来看看,如果对harib10c程序利用harib09d时候的timer.c和bootpack.h,结果会怎样呢?赶紧尝试一下吧,当然是在误差较小的真机上做了。我们这时的程序叫作harib10d。

用真机执行5次harib10d的结果

  1. 0074620088
  2. 0074620077
  3. 0074619893
  4. 0074619902
  5. 0074619967

像这样记流水账似的罗列一堆数值,谁也看不出个所以然。我们还是计算一下平均值吧。

harib10c:0074643595

harib10d:0074619985

可以看得出来,harib10c比harib10d快了23610个数。这下我们能够确定程序的确有了改进,太好了!昨天的辛苦总算没有白费。

那么harib09e和harib09f的定时器控制又怎么样呢?笔者使用它们分别创建了harib10e和harib10f,而且也在真机上进行了测试,结果总结如下。

harib10d:0074619985(最初的定时器)

harib10e:0074629087(舍弃剩余时间,记忆超时时刻)

harib10f:0074633350(导入next)

harib10c:0074643595(导入timers[ ])

大家可以看出,程序每改良一次速度就提高一点。

COLUMN-7 起动3秒后,将count置为0的原因

首先考虑一下这个命令的意思吧。起动3秒后把count复位至0,这与从3秒后开始计数是一样的。画面上要到10秒以后才显示,这样测试的时间就是7秒钟。

事实上,笔者最初并没有加入“count=0;”语句。但那样做的结果是,在真机上测定harib10d时,最高值和最低值的差值竟然达到了150054。这可了不得呀。差值这么大,即使我们比较harib10c和harib10d,也不知道哪个更快。

对于这样的结果,笔者曾茫然不知所措,差一点要放弃性能比较。但后来笔者忽然想起,只要某些条件稍微有些变化,电脑初始化所花费的时间就会有很大变化。这就是为什么我们在起动后3秒钟之内不进行测试的原因。这样做之后,误差急剧减小,终于可以比较结果了,真是太好了。