二、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与组合语言的距离。足证纵然使用组合语言,若不采用精简指令的技巧,其效率不彰。一般程式师很少在组合语言的技巧上下功夫, 以致不能认识组合语言的真面目。 <  
1/2 1 2 下一页 尾页 |