【读书笔记】代码大全26章:代码优化技术

  • 代码优化其实就是反向重构
  • 逻辑优化
    • 当你知道答案后就不要再继续判断了(C++,Java)
    • 将判定列表按顺序排列(VB+7%)
      • 不要盲目听从优化建议
      • 将case转换成if-then-else(C#,Java,VB)
    • 比较类似的逻辑结构(case和if-then-else)
      • Java适合if-then-else
      • C# VB适合case
    • 将复杂的表达式替换成简单的查表(C++,VB)
  • 循环优化
    • 将if移到for循环之外(C++,Java,VB)
    • 将两个条件相同的for循环合并成一个for循环(C++,PHP)
    • 将for循环的步长改为2,再重复一遍循环体(C++,Java,PHP,Python)
    • 尽量减少for循环中的运算,重复的运算提到循环外(C++,C#,Java)
    • 哨兵变量,适合线性查找算法(C#,Java,VB)
    • 如果有多个循环,将循环次数最多的循环放在最里面(C++,Java,PHP)
  • 数据变换
    • 使用循环变量要使用整数而不是浮点数(C++,PHP,VB)
    • 尽量减少数组的维度,可以将二维数组转换成一维数组进行处理(C++,C#,Java,PHP,Python,VB)
    • 使用额外索引(动态规划)
    • 操作索引编号而不是整个数据
    • 使用缓存(C++,Java,Python,VB)
  • 表达式优化
    • 推导等价表达式
      • !a&&!b => !(a||b)
      • sqrt(x)<sqrt(y) => x<y (C++,VB,Python)
    • 减少运算量
      • 乘法转换成加法
      • 指数转换成乘法
      • 充分利用三角函数的变换
      • long long转换成long或int
      • 浮点数转换成定点数或整数
      • 双精度转换成单精度
      • 乘以2除以2可以转换成移位运算
      • 多项式算法(秦九韶算法)
      • 在编译的时候进行初始化:比如将log(2)替换成0.69314718(C++,Java,PHP)
        • 小心系统调用:系统调用的开销是很大的
        • 有时候尝试一次优化可能不够,要多次尝试
      • 赋值的时候要使用正确的数据类型(C++,C#,Java,VB,PHP)
        • int x=3.14(错误)
      • 预先计算结果,运行的时候直接查表(Java,Python)
      • 消除重复的表达式(Java,Python)
  • 函数优化
    • 将函数改成内联(C++)
  • 使用低级语言
    • 有时候即时优化之后性能还是不够,就要用更低级的语言来实现关键部分的代码(C++,Delphi)
  • 时代在变化,手动代码调优慢慢不起作用了
    • 编译器的优化能力在进步,有些代码调优的技术编译器已经帮你完成了
  • 推荐读物
    • 《Java Performance Tuning》O'Relly
    • 《Java Platform Performance: Strategies and Tactics》Boston, MA
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

whitejava2

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值