第八章第三节 代码调优的设计模式和I/O

本节学习如何通过对代码的修改,消除性能瓶颈,提高系统性能?——代码调优、面向性 能的设计模式

Outline

  • Java调优

    • 代码调优的概念
    • 单例模式(Singleton Pattern)
    • 享元模式(Flyweight Pattern)
    • 原型模式(Prototype Pattern)
    • 对象池模式(Object Pool Pattern)
  • 常见的Java I/O方法

Notes

## 代码调优

【代码调优的概念】

  • 代码调优:代码调优不是为了修复bug,而是对正确的代码进行修改以提高其性能,其常常是小规模的变化

    • 调优不会减少代码行数
    • 不要猜原因,而应有明确的优化目标
    • 不要边写程序边调优
    • 不是性能优化的第一选择
    • 代码行数与性能之间无必然的联系
    • 代码调优建立在对程序性能的精确度量基础之上(profiling)
    • 当程序做过某些调整之后,要重新profiling并重新了解需要优化的性能瓶颈,微小的变化能导致优化方向大不相同
  • 性能从不是追求的第一目标,正确性比性能更重要

单例模式(Singleton Pattern)

  • 定义:某些类在应用运行期间只需要一个实例。
  • 现状:某些类在运行时只要需要一个实例就new,导致很多情况下创建多个object。
  • 更好的选择:强制client只能创建一个object实例,避免因为new操作所带来的时空性能(尤其是GC)的损失,也便于复用。
  • 优点: 1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。 2、避免对资源的多重占用(比如写文件操作)。
  • 缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。
  • 实现:
    • 对重构的代码进行封装,只提供一个访问点
    • 提供static的方法允许指定调用
  • 模式图:

  • 注意

    • 1.    只创建一个实例,并且只提供一个全局的访问点;避免创建多个实例的可能。
    • 2.    资源共享情况下,获取实例的方法必须适应多线程并发访问。
    • 3.    提高访问性能。
    • 4.    懒加载(Lazy Load),在需要的时候才被构造。

【享元模型(Flyweight Pattern)】

  • 使用场景: 1、系统有大量相似对象。 2、需要缓冲池的场景。
  • 特点:该模式允许在应用 中不同部分共享使用objects,降低大量objects带来的时空代价
  • 对象的内部状态:不管在什么场合使用该object,内部特征都不变。
  • 对象的外部状态:不是固定的,需要在不同场合context分别指派/计算其值。
  • 实现
    • flyweight声明一个接口来接受外部状态并采取行动
    • ConcreteFlyweight保存可共享状态,UnsharedConcreteFlyweight不可共享
    • FlyweightFactory负责flyweight的创建、管理、提供给客户端
    • 客户端通过索引获取flyweight对象,调用方法计算外在状态
  • 优点:大大减少对象的创建,降低系统的内存,使效率提高。
  • 缺点:提高了系统的复杂度,需要分离出外部状态和内部状态,而且外部状态具有固有化的性质,不应该随着内部状态的变化而变化,否则会造成系统的混乱
  • 模式图

【原型模式(Prototype Pattern)】

【对象池模式(Object Pool Pattern)】

## 常见Java I/O

具体请移步  Java I/O 总结

  • Java中I/O操作主要是指使用Java进行输入,输出操作. Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列。
  • 虽然java IO类库庞大,但总体来说其框架还是很清楚的。从是读媒介还是写媒介的维度看,Java IO可以分为:
    • 输入流:InputStream和Reader
    • 输出流:OutputStream和Writer
  • 而从其处理流的类型的维度上看,Java IO又可以分为:
    • 字节流:InputStream和OutputStream
    • 字符流:Reader和Writer
  • 下面这幅图就清晰的描述了JavaIO的分类:
- 字节流 字符流
输入流 InputStream Reader
输出流 OutputStream Writer

① InputStream/Reader 
InputStream/Reader 是输入流,这里的输入输出是相对于内存来说的。这两个类都是基类(抽象类),不能实例化对象,可以靠它的派生类来实例化对象,实现文件的各种操作。InputStream 是字节流,Reader 是字符流。

② OutputStream/Writer 
OutputStream/Writer 是输出流,这里是指输出到磁盘等存储介质上,这两个类也都是基类,可以用它们的派生类来实现各种操作。OutputStream 是字节流,Writer 是字符流。

【如何选择I/O流】

  • 确定是输入还是输出

    • 输入:输入流 InputStream Reader
    • 输出:输出流 OutputStream Writer
  • 明确操作的数据对象是否是纯文本
    • 是:字符流 Reader,Writer
    • 否:字节流 InputStream,OutputStream
  • 明确具体的设备。
    • 文件:
      读:FileInputStream,, FileReader,
      写:FileOutputStream,FileWriter
    • 数组:
      byte[ ]:ByteArrayInputStream, ByteArrayOutputStream
      char[ ]:CharArrayReader, CharArrayWriter
    • String:
      StringBufferInputStream(已过时,因为其只能用于String的每个字符都是8位的字符串), StringReader, StringWriter
    • Socket流
      键盘:用System.in(是一个InputStream对象)读取,用System.out(是一个OutoutStream对象)打印
  • 是否需要转换流
    • 是,就使用转换流,从Stream转化为Reader、Writer:
    • InputStreamReader,OutputStreamWriter
  • 是否需要缓冲提高效率
    • 是就加上Buffered:BufferedInputStream, BufferedOuputStream, BufferedReader, BufferedWriter
  • 是否需要格式化输出

【软件构造】第八章第三节 代码调优的设计模式和I/O的更多相关文章

  1. 【Spark篇】---Spark调优之代码调优,数据本地化调优,内存调优,SparkShuffle调优,Executor的堆外内存调优

    一.前述 Spark中调优大致分为以下几种 ,代码调优,数据本地化,内存调优,SparkShuffle调优,调节Executor的堆外内存. 二.具体    1.代码调优 1.避免创建重复的RDD,尽 ...

  2. Netty实战之性能调优与设计模式

    设计模式在Netty 中的应用(回顾): 单例模式要点回顾: 一个类在任何情况下只有一个对象,并提供一个全局访问点. 可延迟创建. 避免线程安全问题. 在我们利用netty自带的容器来管理客户端链接的 ...

  3. Spark代码调优(一)

    环境极其恶劣情况下: import org.apache.spark.SparkContext import org.apache.spark.rdd.RDD import org.apache.sp ...

  4. AX2012 ERP “系统慢”调优---跟踪SQL执行,优化代码

    对于用户来说,系统是:慢的,难用的.你看xxx,多好用,多快,多人性化. 对于AX ERP系统也不例外,调优是必须的,调优一般分为几种: 系统性监测针对瓶劲环节提升,如:用户--应用服务器--DB-- ...

  5. BEA WebLogic平台下J2EE调优攻略--转载

    BEA WebLogic平台下J2EE调优攻略   2008-06-25 作者:周海根 出处:网络   前 言 随着近来J2EE软件广泛地应用于各行各业,系统调优也越来越引起软件开发者和应用服务器提供 ...

  6. Java程序性能优化读书笔记(一):Java性能调优概述

    程序性能的主要表现点: 执行速度:程序的反映是否迅速,响应时间是否足够短 内存分配:内存分配是否合理,是否过多地消耗内存或者存在内存泄漏 启动时间:程序从运行到可以正常处理业务需要花费多少时间 负载承 ...

  7. 《Java性能调优》学习笔记(1)

    性能的参考指标 执行时间 -- 从代码开始运行到结束的时间 CPU时间 -- 函数或者线程占用CPU的时间 内存分配 -- 程序在运行时占用内存的情况 磁盘吞吐量 -- 描述IO的使用情况 网络吞吐量 ...

  8. 第一章 -- Java性能调优概述

    写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------主要内容包括: 1.概述 2 ...

  9. Java性能调优概述

    目录 Java性能调优概述 性能优化有风险和弊端,性能调优必须有明确的目标,不要为了调优而调优!!!盲目调优,风险远大于收益!!! 程序性能的主要表现点 执行速度:程序的反映是否迅速,响应时间是否足够 ...

随机推荐

  1. GetSafeHwnd()

    CreateCompatibleBitmap The CreateCompatibleBitmap function creates a bitmap compatible with the devi ...

  2. delphi 2010 启动卡死,过一段时间后出现“displayNotification:堆栈溢出 怎么解决?

    解决方法:打开IE,在Internet选项中,删除历史记录.

  3. 洛谷CF1030F Putting Boxes Together(树状数组)

    题意: 现在有n个物品,第i个物品他的位置在a[i],他的重量为w[i].每一个物品移动一步的代价为他的w[i].目前有2种操作: 1. x y 将第x的物品的重量改为y 2.l r 将编号在 [ l ...

  4. UVA - 10817 Headmaster's Headache

    题目大意:有一些老师,每一位都有自己的工资以及教授的课程.共s<=8个课程.其中的一些老师必须选择,问你保证每节课至少有一个老师的最少总工资. 题解: 首先很容易想到状态压缩,搞一个3进制的数, ...

  5. camshift.py OpenCv例程阅读

    源码在这 #!/usr/bin/env python ''' Camshift tracker ================ This is a demo that shows mean-shif ...

  6. Nginx系列篇一:linux中安装Nginx

    提示: 如遇到yum或者wget的问题, 请详见--->杂集:更换centos yum源 请详见--->杂集:关于VMware中linux使用NAT模式配置 1.安装nginx需要的环境 ...

  7. the little schemer 笔记(2)

    第二章 Do it, Do it Again, and Again, and Again... 假设l是 (Jack Sprat could eat no chicken fat) 那么 (lat? ...

  8. URAL 1890 . Money out of Thin Air (dfs序hash + 线段树)

    题目链接: URAL 1890 . Money out of Thin Air 题目描述: 给出一个公司里面上司和下级的附属关系,还有每一个人的工资,然后有两种询问: 1:employee x y z ...

  9. [已读]基于MVC的Javascript Web 富应用开发

    这本书是12年出版,我买的时间应该是13年,书架上唯一一本盗版→ → 但是看完是在今年. 因为刚拿到的时候,读起来很是磕磕绊绊,就搁置了蛮久.到第二次拿起来的时候,发现已经有部分内容过时,但我还是觉得 ...

  10. Mysql读写分离操作之mysql-proxy

    常见的读写方式 基于程序代码内部实现 在代码中根据select.insert进行选择分类:这类方法也是生产常用的,效率最高,但是对开发人员比较麻烦.架构不能灵活调整 基于中间件的读写分离: mysql ...