搜索
bottom↓
回复: 14

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

[复制链接]

出0入0汤圆

发表于 2013-3-19 22:45:33 | 显示全部楼层 |阅读模式
1.
  1. int test(int a,int b)
  2. {
  3.     int c;
  4.    c = a *b;
  5.   return  c;

  6. void test1(int a ,int b, int *c)
  7. {
  8.     *c = a*b
  9. ]
复制代码

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2013-3-19 23:17:42 | 显示全部楼层
看汇编结果,估计优化了差不多

出0入0汤圆

发表于 2013-3-19 23:21:28 | 显示全部楼层
同意一楼,不过觉得第二个要少一个周期

出0入0汤圆

发表于 2013-3-19 23:24:12 | 显示全部楼层
#define test(a,b) a*b

出0入0汤圆

发表于 2013-3-19 23:25:28 | 显示全部楼层
本帖最后由 wingerchen 于 2013-3-19 23:26 编辑

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



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

出0入0汤圆

发表于 2013-3-19 23:27:30 | 显示全部楼层
估计是一样的吧

出0入0汤圆

 楼主| 发表于 2013-3-20 07:23:14 | 显示全部楼层
本帖最后由 cyj_0220 于 2013-3-20 07:31 编辑
  1.    89          int test(int a,int b)
  2.    \                     test:
  3.      90         
  4.      91          {
  5.      92         
  6.      93              int c;
  7.      94         
  8.      95              c = a *b;
  9.      96         
  10.      97              return  c;
  11.    \   00000000   9F30               MUL     R19, R16
  12.    \   00000002   2D30               MOV     R19, R0
  13.    \   00000004   9F21               MUL     R18, R17
  14.    \   00000006   0D30               ADD     R19, R0
  15.    \   00000008   9F20               MUL     R18, R16
  16.    \   0000000A   0D31               ADD     R19, R1
  17.    \   0000000C   2D00               MOV     R16, R0
  18.    \   0000000E   2F13               MOV     R17, R19
  19.    \   00000010   9508               RET
  20.      98         
  21.      99          }
  22.     100         

  23.    \                                 In  segment CODE, align 2, keep-with-next
  24.     101          void test1(int a ,int b, int *c)
  25.    \                     test1:
  26.     102         
  27.     103          {
  28.     104         
  29.     105              *c = a*b;
  30.    \   00000000   9F30               MUL     R19, R16
  31.    \   00000002   2D30               MOV     R19, R0
  32.    \   00000004   9F21               MUL     R18, R17
  33.    \   00000006   0D30               ADD     R19, R0
  34.    \   00000008   9F20               MUL     R18, R16
  35.    \   0000000A   0D31               ADD     R19, R1
  36.    \   0000000C   01FA               MOVW    R31:R30, R21:R20
  37.    \   0000000E   8200               ST      Z, R0
  38.    \   00000010   8331               STD     Z+1, R19
  39.     106         
  40.     107          }
  41.    \   00000012   9508               RET
复制代码
ewavr编译生成的汇编,一本书上写的:使用全局变量比函数传递参数更加有效率。这样做去除了函数调用参数入栈和函数完成后参数出栈所
需要的时间。然而决定使用全局变量会影响程序的模块化和重入,故要慎重使用。
但是分析汇编代码,感觉不使用全局变量的时候效率更高

出0入0汤圆

发表于 2013-3-20 08:43:00 | 显示全部楼层

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

理论分析,应该第二种高

出0入0汤圆

 楼主| 发表于 2013-3-20 23:06:43 来自手机 | 显示全部楼层
UCos都是第二种方式的,请问这么写有什么有点?

出0入0汤圆

发表于 2013-3-20 23:27:53 | 显示全部楼层
void test1(int a ,int b, int *c)
{
    *c = a*b
]
这个不能返回指针 应该修改成指针函数

出0入0汤圆

发表于 2013-3-20 23:28:37 | 显示全部楼层
效率 差不多

出0入0汤圆

发表于 2013-3-28 17:35:09 | 显示全部楼层
觉得要睇编译器与芯片支持的指令了,
不能一概而论,

出0入0汤圆

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

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

出0入0汤圆

发表于 2013-3-28 21:32:18 | 显示全部楼层
第一种会多一次数据拷贝,仅此而已

出0入17汤圆

发表于 2013-3-28 21:52:00 | 显示全部楼层
第一种效率更高;
机器浪费的是几个微秒,人脑浪费是几分钟乃至几天
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-12 14:16

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表