这两种写法哪种方法效率高?
1.int test(int a,int b){
int c;
c = a *b;
returnc;
}
void test1(int a ,int b, int *c)
{
*c = a*b
] 看汇编结果,估计优化了差不多 同意一楼,不过觉得第二个要少一个周期 #define test(a,b) a*b 本帖最后由 wingerchen 于 2013-3-19 23:26 编辑
for(i=0;i<b;i++) a+=a;
不带乘法器的CPU,这个比较高效吧。 估计是一样的吧 本帖最后由 cyj_0220 于 2013-3-20 07:31 编辑
89 int test(int a,int b)
\ test:
90
91 {
92
93 int c;
94
95 c = a *b;
96
97 returnc;
\ 00000000 9F30 MUL R19, R16
\ 00000002 2D30 MOV R19, R0
\ 00000004 9F21 MUL R18, R17
\ 00000006 0D30 ADD R19, R0
\ 00000008 9F20 MUL R18, R16
\ 0000000A 0D31 ADD R19, R1
\ 0000000C 2D00 MOV R16, R0
\ 0000000E 2F13 MOV R17, R19
\ 00000010 9508 RET
98
99 }
100
\ Insegment CODE, align 2, keep-with-next
101 void test1(int a ,int b, int *c)
\ test1:
102
103 {
104
105 *c = a*b;
\ 00000000 9F30 MUL R19, R16
\ 00000002 2D30 MOV R19, R0
\ 00000004 9F21 MUL R18, R17
\ 00000006 0D30 ADD R19, R0
\ 00000008 9F20 MUL R18, R16
\ 0000000A 0D31 ADD R19, R1
\ 0000000C 01FA MOVW R31:R30, R21:R20
\ 0000000E 8200 ST Z, R0
\ 00000010 8331 STD Z+1, R19
106
107 }
\ 00000012 9508 RETewavr编译生成的汇编,一本书上写的:使用全局变量比函数传递参数更加有效率。这样做去除了函数调用参数入栈和函数完成后参数出栈所
需要的时间。然而决定使用全局变量会影响程序的模块化和重入,故要慎重使用。
但是分析汇编代码,感觉不使用全局变量的时候效率更高 与
1 - 编译器
2 - 芯片
有关。
理论分析,应该第二种高 UCos都是第二种方式的,请问这么写有什么有点? void test1(int a ,int b, int *c)
{
*c = a*b
]
这个不能返回指针 应该修改成指针函数 效率 差不多 觉得要睇编译器与芯片支持的指令了,
不能一概而论, 个人喜欢第一种, 输入输出接口清晰明确, 简洁, 相对安全, 易于理解, 维护. 比第二个稍微高效点.
第二个要对传入的指针参数进行检查, 不然随便给个地址, 到时候莫名其妙死机就麻烦了. 调试时很难找到. 你没有加入进去, 不公平啊. {:lol:}
另外, 又不是频繁的访存.我觉得没必要纠结于几个时钟周期.
过早优化是万恶之源.........性能瓶颈也许不再这里.
建议先找到瓶颈在优化吧. 第一种会多一次数据拷贝,仅此而已 第一种效率更高;
机器浪费的是几个微秒,人脑浪费是几分钟乃至几天
页:
[1]