当前位置: 首页 > news >正文

什么是优化

什么是优化?

可以收获什么

本篇文章会跟分享一些个人认为的优化的本质是什么。这里的优化是指效率上的优化,而非指代码的可读性,易于维护性等代码质量上的优化。通过本篇文章你将会知道什么是优化,优化的本质是什么,还有获得对于优化的一些思考

越通用效率越底下

在程序中有一句话是,越通用的东西其效率就越低下,这是有原因的。因为一个工具如果想要通用的话,那么就需要考虑各种情况,让代码逻辑更加的通用的。就很难去针对特殊的情况做特殊的处理。
但是如果代码是专用的,那么可以针对适用的场景,可能发生的特殊情况进行特殊的处理。那么其效率也就会变得更高。

优化就是对特殊情况做特殊处理

优化并不难。优化并不只是想象中的对一个使用一个效率更高的算法,这种算是优化,但是一般情况下这种优化是比较难做到的。因为这种是要求创新,创造的。
而优化还可以是,针对特殊的数据,特殊的情况,使用不同的算法。而非是仅仅依靠一套算法解决所有的问题。也就是所谓的术业有专攻,不要想着 All in 就是这个道理。

例子一:排序优化

举个例子。经典的排序算法有十几种,有没有一种排序算法的是最优的?其实很难说,因为不同的情况下,可能另一种排序算法可能就更加适用。因此如果我们在排序的时候可以对所要排序的数据进行分析,从而调整排序算法使用更加适合的算法去进行排序。这对于排序来说就是一种优化。

例子二:java的锁升级

再举一个例子,java中对synchronized的锁优化。如果有了解的话在优化之前,synchronized是重度锁。很多人不愿意去使用它。在我去了解这个锁的构造之前,我在想是不是这个锁的方案很垃圾,优化之后是不是使用了更加创新的锁方案?
但其实不是的,这个优化其实就是一个锁升级的过程。这个锁的方案依旧没有改变,在特殊情况下还是需要这种锁方案才能保证其安全性,但是在很多情况下并不会出现争抢的状态,那么也就没有锁的必要也就没有必要使用这么安全的锁了。因此可以使用更加轻度的方案去保证锁安全。
因此这个优化方案就是针对不同的情况使用更加轻度的锁方案。但是出现大量争抢的情况使用的还是原本的锁方案。
这个优化也说明了,所谓的优化就是对特殊的情况使用更加适合的方案。并不仅仅是所谓的 使用更加优秀的方案

例子三:Redis中的数据结构设计

有兴趣的可以去看看Redis中的一些数据结构的设计。会发现其并不仅仅是使用一种数据结构。针对不同的情况下会底层会使用不同的编码实现。
比如,当一个数据结构中存储的数据都是一样的。那么就可以使用比较简单的编码进行存储。但是如果数据的数据类型是不一样的,那么就需要使用更加复杂的编码进行存储。
如果不做特殊的处理的话,统一使用复杂的编码进行存储,当然从功能上是可行的,但是从性能上存储空间上浪费的。因此这也属于一种优化

优化需要结合具体场景

现在所学的算法都是经典算法, 所处理的情况也是通用的情况。适合一类问题。我们可以使用这些算法为我们所用,但是如果我们想要去改良一个算法的话(注意这里说的是改良而不是创造)首先需要的就是一个优化的方向,而这个优化的方向就是所谓的具体场景。
例如,在使用到这个算法的大部分场景中,都会有一个特殊的需求。那么是否可改造一下算法,使这个需求的实现更加高效,当然可能会付出其他的代价。但是对于实际应用场景中,付出的代价可以忽略不计,但是得到的优化效果却能够带来大量的收益。那么我们就不得不说这是一种优化。
因此本人觉得,所谓的优化也是需要根据实际的应用场景而论的。
一个不太恰当的例子:哈夫曼编码
使用更短的编码去表示使用频率更高的字符。而使用更长的编码去表示使用频率更低的字符。这就是根据实际的情况作出的一种取舍。

总结

本篇文章中使用了三个例子说明了优化并不只是创建一种新的算法,或者方案。也可以是对特殊的情况,作出特殊的更加适合的处理。并且分享了本人对于优化方案的一种看法:优化需要结合具体场景

相关文章:

  • 基于Springboot+vue的论坛管理系统 elementui
  • 大量if else的优化方案
  • 牛客 NC24755 [USACO 2010 Dec S]Apple Delivery
  • Git做版本管理及CHANGELOG
  • python经典编程100例(1)
  • GO语言 | go work 神一般的管理 多个module没烦恼
  • 【C语言】指针数组
  • 基于51单片机数字电压表仿真设计_数码管显示
  • 种草模式崛起!小红书KOL达人种草成推广热门方向!
  • Git Commit规范指北
  • 易观之星 | “2022年度用户推荐数字应用”投票通道开启
  • Flutter实战之go_router路由组件入门指南
  • Java--MybatisPlus Wrapper构造器;分页;MP代码生成器(四)
  • JS高级(数据类型,数据_变量_内存)
  • 分类模型评估的实际编码
  • 【剑指offer】让抽象问题具体化
  • 2019.2.20 c++ 知识梳理
  • CSS魔法堂:Absolute Positioning就这个样
  • leetcode386. Lexicographical Numbers
  • Node + FFmpeg 实现Canvas动画导出视频
  • SpringBoot 实战 (三) | 配置文件详解
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 手机端车牌号码键盘的vue组件
  • 我有几个粽子,和一个故事
  • Java数据解析之JSON
  • python最赚钱的4个方向,你最心动的是哪个?
  • 从如何停掉 Promise 链说起
  • ​Linux·i2c驱动架构​
  • #if 1...#endif
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (31)对象的克隆
  • (8)STL算法之替换
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (算法)Travel Information Center
  • (五)c52学习之旅-静态数码管
  • (五)关系数据库标准语言SQL
  • (一)Java算法:二分查找
  • (转)Windows2003安全设置/维护
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .net web项目 调用webService
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • .NET开源项目介绍及资源推荐:数据持久层
  • /usr/local/nginx/logs/nginx.pid failed (2: No such file or directory)
  • @cacheable 是否缓存成功_Spring Cache缓存注解
  • @我的前任是个极品 微博分析
  • [Android]通过PhoneLookup读取所有电话号码
  • [AX]AX2012 R2 出差申请和支出报告
  • [C#]C# OpenVINO部署yolov8图像分类模型
  • [Codeforces] probabilities (R1600) Part.1
  • [Excel VBA]单元格区域引用方式的小结
  • [HDU3710]Battle over Cities