cyj_0220 发表于 2013-3-19 22:45:33

这两种写法哪种方法效率高?

1.int test(int a,int b)
{
    int c;
   c = a *b;
returnc;

void test1(int a ,int b, int *c)
{
    *c = a*b
]

jeffwei 发表于 2013-3-19 23:17:42

看汇编结果,估计优化了差不多

zhonggp 发表于 2013-3-19 23:21:28

同意一楼,不过觉得第二个要少一个周期

wingerchen 发表于 2013-3-19 23:24:12

#define test(a,b) a*b

wingerchen 发表于 2013-3-19 23:25:28

本帖最后由 wingerchen 于 2013-3-19 23:26 编辑

for(i=0;i<b;i++) a+=a;



不带乘法器的CPU,这个比较高效吧。

crazy_bin 发表于 2013-3-19 23:27:30

估计是一样的吧

cyj_0220 发表于 2013-3-20 07:23:14

本帖最后由 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编译生成的汇编,一本书上写的:使用全局变量比函数传递参数更加有效率。这样做去除了函数调用参数入栈和函数完成后参数出栈所
需要的时间。然而决定使用全局变量会影响程序的模块化和重入,故要慎重使用。
但是分析汇编代码,感觉不使用全局变量的时候效率更高

chinabn 发表于 2013-3-20 08:43:00


1 - 编译器
2 - 芯片
有关。

理论分析,应该第二种高

cyj_0220 发表于 2013-3-20 23:06:43

UCos都是第二种方式的,请问这么写有什么有点?

wind2100 发表于 2013-3-20 23:27:53

void test1(int a ,int b, int *c)
{
    *c = a*b
]
这个不能返回指针 应该修改成指针函数

wind2100 发表于 2013-3-20 23:28:37

效率 差不多

can 发表于 2013-3-28 17:35:09

觉得要睇编译器与芯片支持的指令了,
不能一概而论,

monkerman 发表于 2013-3-28 18:17:06

个人喜欢第一种, 输入输出接口清晰明确, 简洁, 相对安全, 易于理解, 维护. 比第二个稍微高效点.
第二个要对传入的指针参数进行检查, 不然随便给个地址, 到时候莫名其妙死机就麻烦了. 调试时很难找到. 你没有加入进去, 不公平啊. {:lol:}

另外, 又不是频繁的访存.我觉得没必要纠结于几个时钟周期.
过早优化是万恶之源.........性能瓶颈也许不再这里.
建议先找到瓶颈在优化吧.

tomhe666 发表于 2013-3-28 21:32:18

第一种会多一次数据拷贝,仅此而已

hhxb 发表于 2013-3-28 21:52:00

第一种效率更高;
机器浪费的是几个微秒,人脑浪费是几分钟乃至几天
页: [1]
查看完整版本: 这两种写法哪种方法效率高?