8-5 面向性能的代码调优
1. 以下关于代码调优的说法,不正确/不恰当的是
A 代码行数越少,代码的执行性能倾向于更好
B 每写完一个method的代码,最好对其性能进行优化,确保时空复杂性优化
C 直到软件开发完全结束、所有其他质量指标均已满足期望,再进行代码调优
D 每次进行代码调优前,必须要使用profiling工具进行性能监控和度量
E 每次代码调优之后、修改代码提交Git仓库之前,都需要进行regression testing
正确答案:AB
2.
美于Singleton没汁模式,鋭法不正磆/不恰当的是__
A 符合孩模式的ADT,不血具有constructor,以避免client創建多个突例
B 符合垓模式的ADT,其rep中血具有一-个static的field,其炎型是該ADT本身
C 符合孩模式的ADT,竝具各一-个方法getInstance(),在核方法内迸行垓ADT的new操作
D State没汁模式中,毎个State的具体子炎,可遵守Singleton模式迸行突現
正确答案:AC
A选项:每个类都有constructor,只不 过该模式下的constructor是private的, 不能让client调用
C选项:除非用lazy load的策略,否则 getInstance方法中只需直接返回rep中 的单例对象
3.
使用Flyweight模式实现文本编辑器中对各个"字母' 1对象的复用,以下说法不正确的是____
A "字母的内容(例如a、 b)是内特性,"字母"在编辑器中展示的字体、字号、颜色是"外特性"
B 即使"字母"对象的字体/字号/颜色可变化,但"字母" ADT仍应该是immutable的
C "字母" ADT的rep中需包含其内容、颜色、字体、字号等属性
D 只需要26个大写字母和26个小写字母的对象实例,即足够client在编辑器中使用"字母"的功能
E 客户端代码中需要维护某些数据来管理或计算每个"字母"对象在文档中不同位置的字体、字号、颜色等。
正确答案:C
4.
关于Prototype模式,说法不正确的是
A 遵循该模式的ADT,要实现Cloneable接口并override0bject的clone( )方法
B 0bject的clone( )方法,缺省实现的是shallow copy而非deep copy
C 若在调用ADT的clone( )时抛出CloneNotSupportedException,则意味着该ADT没有override0bject的clone( )
D 在进行对象构造时,相比于直接使用构造器来说,使用clone()的代价较小、构造时间更短
正确答案:CD
5.
关于Object Pool的说法,不正确的是_
A 不采用该模式时,如果一个对象实例不再有活性,即会被GC;采用该模式时,将对象实例加入pool,相当于强行保持其活性而不会被GC
B 当client需要一个对象实例时,先到pool中获取,使用完之后,再归还回去
C 原本可被GC的对象,现在要留在pool中,导致内存浪费,但节省了频繁的new和GC的时间
D 不能把不同类型的对象实例放在同一个pool中进行管理,需要分别设定不同的pool
正确答案:D
6.
关于Singleton、Flyweight、
Object Pool设计模式之间的异同,说法不正确的是___
A Singleton相当于把每个class做成了pool,其中包含唯一的对象实例,且是static的
B Flyweight相当于只使用一个对象实例来表示一组具有相同内属性但不同外属性的对象
C Flyweight模式维持一个pool,pool中包含一组具有不同内属性的对象实例
D 这三种模式的client使用某个对象实例时,均需要从pool中申请获得实例、用完归还给pool
E 目的都是为了降低new对象实例时的时间代价,降低了程序运行时内存消耗
正确答案: DE
7.
以下
能够减少创建object的数降低GC的代价
A 方法中的临时变量尽可能使用
primitive数据类型(e.g. double),减少使用其对象数据类型(e.g.,Double)
B 除非迫不得已(ADT安全性要求),不要使用防御式拷贝
C 对频繁使用的对象用object pool进行canonicalization,哪怕是类似于Integer这样的"小”对象
D 尽量使用String a =“foo”的方式来定义常量字符串,避免new String(“foo")
E 尽可能使用类的静态工厂方法进行对象创建,避免直接用new
F 在为ADT设计rep的时候,除非迫不得已,最好用简单数据类型
正确答案:ABCDEF