3 测试性能(harib10c~harib10f)
从昨天开始,我们就在不断地对定时器进行改善,而且以后还要继续改善,但我们不能总是自我满足呀,我们要亲自感受一下到底改善到什么程度了。所以我们要测试性能。
我们之所以如此专注于定时器的改良,理由很简单,是因为在今后的开发中会经常使用定时器。经常使用的东西当然要做好。同理,我们也努力地改进了图层控制程序。
测试性能的方法很简单:先对HariMain略加修改,恢复变量count,然后完全不显示计数,全力执行“count++;”语句。当到了10秒后超时的时候,再显示这个count值。程序所做的只有这么多。可是需要注意,必须在起动3秒后把count复位为0一次。为什么要这样做呢?我们在后面的专栏里说明。
本次的HariMain节选
int mx, my, i, count = 0;
(中略)
for (;;) {
count++; /* 这里! */
io_cli();
if (fifo8_status(&keyfifo) + fifo8_status(&mousefifo) + fifo8_status(&timerfifo) == 0) {
io_sti();
} else {
if (fifo8_status(&keyfifo) != 0) {
(中略)
} else if (fifo8_status(&mousefifo) != 0) {
(中略)
} else if (fifo8_status(&timerfifo) != 0) {
i = fifo8_get(&timerfifo); /* 超时的是哪个呢? */
io_sti();
if (i == 10) {
putfonts8_asc_sht(sht_back, 0, 64, COL8_FFFFFF, COL8_008484, "10[sec]", 7);
sprintf(s, "%010d", count); /* 这里! */
putfonts8_asc_sht(sht_win, 40, 28, COL8_000000, COL8_C6C6C6, s, 10); /* 这里! */
} else if (i == 3) {
putfonts8_asc_sht(sht_back, 0, 80, COL8_FFFFFF, COL8_008484, "3[sec]", 6);
count = 0; /* 开始测定 */
} else {
/* 0还是1 */
if (i != 0) {
timer_init(timer3, &timerfifo, 0); /* 下面是设定为0 */
boxfill8(buf_back, binfo->scrnx, COL8_FFFFFF, 8, 96, 15, 111);
} else {
timer_init(timer3, &timerfifo, 1); /* 下面是设定为1 */
boxfill8(buf_back, binfo->scrnx, COL8_008484, 8, 96, 15, 111);
}
timer_settime(timer3, 50);
sheet_refresh(sht_back, 8, 96, 16, 112);
}
}
}
}
■■■■■
我们先执行一下这段程序吧。运行“make run”。
在笔者的环境中执行haribl10c
像这样,10秒钟结果就出来了。大家试着运行几次“make run”,会发现每次结果都不同。我们运行了5次。在测试期间的10秒钟内,不要动鼠标也不要按键。如果动鼠标或按键了,程序就不得不进行光标的显示处理,这样会减缓count的增长。
用“make run”运行5次harib10c的结果
0002638668
0002639649
0002638944
0002648179
0002637604
5次结果是如此发散,是由于使用模拟器而受到了Windows的影响。5次结果中,最大值与最小值的差有10575之大。因此我们在真机上也执行“make install”1看看。
1 在真机上也进行了测试:笔者用的真机是“AMD Duron 800MHz,内存为192MB”的组装机。
用真机执行5次harib10c的结果
0074643522
0074643698
0074643532
0074643699
0074643524
靠按复位按钮完成多次起动,的确很麻烦,我们只做了5次。得到的数值收敛得很好,最大值和最小值的差只有177。果然还是真机好呀。虽然用了真机,可还是出现了177的误差,其原因在于电脑内部的温度変化,或时钟频率的微妙変化。
■■■■■
下面来看看,如果对harib10c程序利用harib09d时候的timer.c和bootpack.h,结果会怎样呢?赶紧尝试一下吧,当然是在误差较小的真机上做了。我们这时的程序叫作harib10d。
用真机执行5次harib10d的结果
0074620088
0074620077
0074619893
0074619902
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秒钟之内不进行测试的原因。这样做之后,误差急剧减小,终于可以比较结果了,真是太好了。