硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1875|回复: 10
收起左侧

性能提升-有趣的代码

[复制链接]

2

主题

2

回帖

8

积分

新手上路

积分
8
发表于 2024-9-6 15:38:30 | 显示全部楼层 |阅读模式
[C] 纯文本查看 复制代码
void send_info(uint8_t* from, uint8_t* to, uint16_t cnt)
{
    uint16_t i = (cnt + 7) / 8;

    switch (cnt % 8) {
        case 0: do { *to++ = *from++;
        case 7: *to++ = *from++;
        case 6: *to++ = *from++;
        case 5: *to++ = *from++;
        case 4: *to++ = *from++;
        case 3: *to++ = *from++;
        case 2: *to++ = *from++;
        case 1: *to++ = *from++;
        } while (--i > 0);
    }
}



来分享一段大佬写的内核高性能代码。大家都来分析下呢?优化点在哪
这个代码本意是:复制指定数量(cnt)的字节数据,从 from 缓冲区到 to 缓冲区
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116197
QQ
发表于 2024-9-7 09:16:20 | 显示全部楼层
谢谢楼主分享,这个代码实现非常有意
回复

使用道具 举报

24

主题

195

回帖

267

积分

高级会员

积分
267
QQ
发表于 2024-9-7 11:13:00 | 显示全部楼层
达夫设备,出成面试考题了哈哈。
远古时代的优化了,这个用于内存复制倒是没太大优化。重点是极小的判断开销实现迭代,C语言实现面对汇编的效率优化,当时应该是迭代方法的飞跃,主要这个写法非常好更改复用。
现代编译器的智能优化应该已经超越这个手动优化的写法了(没仔细测过),如果一些地方需要O0,这个写法哪怕现在也具有参考意义。
可见知乎 深入理解达夫设备 - 知乎 (zhihu.com)
回复

使用道具 举报

85

主题

784

回帖

1039

积分

至尊会员

积分
1039
发表于 2024-9-7 21:10:03 | 显示全部楼层
很有意思,把switch用的很好。c的东西很少,但是用好真的很难
回复

使用道具 举报

2

主题

2

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2024-9-13 10:43:42 | 显示全部楼层
yono 发表于 2024-9-7 11:13
达夫设备,出成面试考题了哈哈。
远古时代的优化了,这个用于内存复制倒是没太大优化。重点是极小的判断开 ...

是的,要玩好c,得把编译原理和汇编指令这些搞清楚。写得好就很酷,远古大佬,令人膜拜
回复

使用道具 举报

2

主题

2

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2024-9-13 10:45:06 | 显示全部楼层
庄永 发表于 2024-9-7 21:10
很有意思,把switch用的很好。c的东西很少,但是用好真的很难

是的,c有意思,学精用的好又很难
回复

使用道具 举报

0

主题

51

回帖

51

积分

初级会员

积分
51
发表于 2024-9-21 00:05:14 | 显示全部楼层
好像单片机取余运算很慢
回复

使用道具 举报

3

主题

425

回帖

434

积分

高级会员

积分
434
发表于 2024-9-21 14:26:08 | 显示全部楼层
死不低头 发表于 2024-9-21 00:05
好像单片机取余运算很慢

常数8,16,32这些2的幂次取余,只是寄存器右移指令而已。
回复

使用道具 举报

0

主题

16

回帖

16

积分

新手上路

积分
16
发表于 2024-9-23 01:06:14 | 显示全部楼层
glory 发表于 2024-9-21 14:26
常数8,16,32这些2的幂次取余,只是寄存器右移指令而已。

并非右移,而是与 2^N-1 相与
回复

使用道具 举报

9

主题

138

回帖

165

积分

初级会员

积分
165
发表于 2024-9-23 13:51:15 | 显示全部楼层
现在写代码, 都是拿空间和性能换取团队开发的效率.
编写代码尽量简化和拆分逻辑, 使其易于理解. 很多地方不可避免的会慢一些, 代码行数多一些.
比如有个功能, 可能是思考了很久, 把各种逻辑组合在一起, 优化之后的代码, 结果就是后面的新人来维护, 根本看不懂为什么这样写.
回复

使用道具 举报

0

主题

51

回帖

51

积分

初级会员

积分
51
发表于 2024-9-28 13:37:03 | 显示全部楼层
glory 发表于 2024-9-21 14:26
常数8,16,32这些2的幂次取余,只是寄存器右移指令而已。

如果不是这些数呢,比如69421%77,记得去年试过一次,拿没有浮点单元的F1写一个很长的循环,取余运算和浮点乘法差不多快
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-6-9 20:27 , Processed in 0.295875 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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