版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如果有侵权请立即联系:55525090@qq.com,我们立即下架或删除。
简介:代码优化的思路
大连理工大学 赖晓晨
代码优化:时间优化、空间优化
代码优化与程序的可读性:矛盾
需要优先优化的代码对象:频繁使用的代码
优化概述
例:清除从指针data开始的N个字节空间
void memclr(char *data, int N)
{
for ( ; N>0; N--)
{
*data=0;
data++;
}
}
data
N
假设32位处理器
问题:
编译器不知道N是否为0。
编译器不知道data是否4字节对齐。
编译器不知道N是否为4的倍数
void memclr(char *data, int N)
{
for ( ; N>0; N--)
{
*data=0;
data++;
}
}
例:清除从指针data开始的N个字节空间
假设32位处理器
结论
编译器必须是保守的:
必须假定N的所有可能值
必须假定data所有可能的边界值
编写高效C代码的要求
了解哪些方面编译器是保守的
了解编译器对应的处理器体系结构
高效的C程序设计的研究途径
通过研究编译器如何把C代码转换成ARM汇编代码,以帮助程序员区分快速
和慢速的C代码,进而指导程序员进行C程序设计。
嵌入式软件设计
大连理工大学 赖晓晨
变量的数据类型选择
大连理工大学 赖晓晨
假设采用32位ARM机器
Load/store不同的C数据类型,效率不同。
变量的数据类型
例:求校验和
int checksum_v1(int *data)
{
char i;
int sum=0;
for (i=0; i<64; i++)
sum += data[i];
return sum;
}
i声明为char的优缺点?
char表达的范围超过了64,可
以完成题目要求。
char更节省寄存器和内存空间
checksum_v1_s
MOV r2,r0 ; r2 = data,地址指针
MOV r0,#0 ; sum = 0
MOV r1,#0 ; i = 0,计数器
checksum_v1_loop
LDR r3,[r2,r1,LSL #2] ; r3 = data[i]
ADD r1,r1,#1 ; r1 = i+1
AND r1,r1,#0xff ; i = (char)r1
CMP r1,#0x40 ; compare i, 64
ADD r0,r3,r0 ; sum += r3
BCC checksum_v1_loop ; if (i<64) loop
MOV pc,r14 ; return sum
例:求校验和
i是char型,超过255要归零,所以汇编程序中要确保其不超过255。
上述汇编共10条指令
讨论
int checksum_v1(int *data)
{
char i;
int sum=0;
for (i=0; i<64; i++)
sum += data[i];
return sum;
}
int checksum_v2(int *data)
{
unsigned int i;
int sum=0;
for (i=0; i<64; i++)
sum += data[i];
return sum;
}
例:求校验和
checksum_v2_s
MOV r2,r0 ; r2 = data
MOV r0,#0 ; sum = 0
MOV r1,#0 ; i = 0
checksum_v2_loop
LDR r3,[r2,r1,LSL #2] ; r3 = data[i]
ADD r1,r1,#1 ; r1++
CMP r1,#0x40 ; compare i, 64
ADD r0,r3,r0 ; sum += r3
BCC checksum_v2_loop ; if (i<64) goto loop
MOV pc,r14 ; return sum
共9条语句,少了一条
例:求校验和
short checksum_v3(short *data)
{
unsigned int i;
short sum=0;
for (i=0; i<64; i++)
sum = (short)(sum + data[i]);
return sum;
}
假设需校验的数据为16位
例:16位数据求校验和
checksum_v3_s
MOV r2,r0 ; r2 = data
MOV r0,#0 ; sum = 0
MOV r1,#0 ; i = 0
checksum_v3_loop
ADD r3,r2,r1,LSL #1 ; r3 = &data[i]
LDRH r3,[r3,#0] ; r3 = data[i]
ADD r1,r1,#1 ; i++
CMP r1,#0x40 ; compare i, 64
ADD r0,r3,r0 ; r0 = su... 更多>>