二、C
C近来极受美国各系统公司的推崇,我们特以之与组合语言作个比较,但不幸的是在指令的精简上,就显得力不从心,不像组合语言那样可以斤斤计较。
因此,我们祇能就点阵移位、查小表及查总表的方式,测试其效率。首先,利用查大表的方式如下:
1: main()
2: {
3: unsigned char s[24][3];
4: unsigned short tab[256], d[48][3], count;
5: register short i,j,k;
6:
7: for (count = 0; count < 10000; count++)
8: {
9: k = 0;
10: for (i = 0; i < 24; i++)
11: {
12: for (j = 0; j < 3; j++)
13: d[k][j] = d[k + 1][j] = tab[s[i][j]];
14: k += 2;
15: }
16: }
17: }
程式制作时间10分钟,较组合语言稍快;占用空间4575字元,则大了三倍,至于执行速度为18秒,慢了七倍之多。
再换个方法,试一试查小表如次:
1: main()
2: {
3: unsigned char i,j, s[24][3], d[48][6], tab[16];
4: unsigned short count;
5: register short k, l, x;
6:
7: for (count = 0; count < 10000; count++)
8: {
9: k = 0;
10: for (i = 0; i < 24; i++)
11: {
12: l = 0;
13 for (j = 0; j < 3; j++)
14: {
15: x = s[i][j];
16: d[k][l] = d[k + 1][l] = tab[x & 0360 >> 4];
17: d[k][l+1] = d[k + 1][l + 1] = tab[x & 017];
18: l += 2;
19: }
20: k += 2;
21: }
22: }
23: }
占用空间为4,693 字元,比组合语言大了五倍;速度为30秒,则慢了四倍多。这证明了组合语言的灵活性,在空时效率交换的技术运用下,可以选择最有利的条件。再看利用位置的方式,结果如何?
1: main()
2: {
3: unsigned char ss[24][3];
4: unsigned short dd[48][3];
5: int i, k, count;
6: register short d, j;
7: register unsigned char s;
8:
9: for (count = 0; count < 10000; count++)
10: {
11: k = 0;
12: for (i = 0; i < 24; i++)
13: {
14: for (j = 0; j < 3; j++)
15: {
16: s = ss[i][j];
17: d = 0;
18: if (s & 01)
19: d |= 03;
20: if (s & 02)
21: d |= 014;
22: if (s & 04)
23: d |= 060;
24: if (s & 010)
25: d |= 0300;
26: if (s & 020)
27: d |= 01400;
28: if (s & 040)
29: d |= 06000;
30: if (s & 0100)
31: d |= 030000;
32: if (s & 0200)
33: d |= 0140000;
34: dd[k + 1][j] = dd[k][j] = d;
35: }
36: k += 2;
37: }
38: }
39:}
占用的空间为 4,727字元,较组合语言大四倍,执行时间29秒,差不多是四倍的差异。这种采用高阶指令的方式,拉近了C与组合语言的距离。足证纵然使用组合语言,若不采用精简指令的技巧,其效率不彰。一般程式师很少在组合语言的技巧上下功夫, 以致不能认识组合语言的真面目。