• 工作笔记


    1. 优化方向

    1.1 减少数据拷贝
    1.1.1 尽量减少数据拷贝次数,采用指针而非实际数据传参
    1.1.2 内核与用户态间数据拷贝注意使用cache,与不带cache的性能可相差10倍(具体参见内存山图)
    i.e. 鱼眼特性拷贝用户态5400kb的YUV只需6ms,从海思解码帧存(内核态分配地址)拷贝需30ms,采用带cache的帧存后与用户态拷贝耗时一致

    1.2 cache命中优化
    1.2.1 空间局部性: cache采用cache line传输,将相邻数据放在一起可提升cache命中;减少全局变量与静态变量的使用(一般与代码相距较远);使用section宏让相关代码在内存里紧密排列
    1.2.2 时间局部性: 同一段数据采用函数回调方式层层处理(类似linux网络协议栈处理)以提升cache命中率,相反如果两个线程一个线程处理完通知另一线程处理,等另一线程调度时cache可能已经发生变化

    1.3 锁优化
    1.3.1 减少锁的使用
    1.3.2 根据场景不同使用不同的锁(自旋锁,读写锁,顺序锁...)
    1.3.3 实现无锁代码(CAS...)

    1.4 减少调度
    1.4.1 设置CPU亲和性

    2. 性能调试工具

    2.1 perf
    2.1.1 编译perf
    perf为linux自带工具,在内核目录/tools/perf下直接make即可,可能会出现以下两个问题
    gcc threat warning as error: 交叉编译perf需执行参数,具体参见Makefile首部注释说明很清楚 i.e. make ARCH=arm CROSS_COMPILE=arm-hisiv400-linux- WERROR=0
    can't find liblk.a: 注意编译perf依赖liblk.a,如果是交叉编译的perf需先删除默认路径下liblk.a(基于x86的库)并交叉编译生成对应的库

    2.1.2 使用perf查看热点函数
    perf top -G > result.txt

    转载于:https://www.cnblogs.com/Five100Miles/p/9235752.html

  • 相关阅读:
    Codeforces 1291 Round #616 (Div. 2) B
    总结
    刷新DNS解析缓存+追踪+域名解析命令
    数学--数论--Hdu 5793 A Boring Question (打表+逆元)
    Lucene.net(4.8.0) 学习问题记录六:Lucene 的索引系统和搜索过程分析
    LeetCode 117 Populating Next Right Pointers in Each Node II
    LeetCode 116 Populating Next Right Pointers in Each Node
    test test
    LeetCode 115 Distinct Subsequences
    LeetCode 114. Flatten Binary Tree to Linked List
  • 原文地址:https://www.cnblogs.com/twodog/p/12136633.html
Copyright © 2020-2023  润新知