本帖最后由 Aone 于 2013-7-27 12:23 编辑

想必Rectangle或者Point这样的数据类在我们的程序中特别是当前的游戏中是非常常用的类型。那么一些类中获取这些属性的时候为了封装,往往会写一个get函数return一个复制的Rectangle对象给外部。目的是为了防止被获取内部rect引用后直接被修改。
比如:

  1. public function get bodyRect():Rectangle{
  2. return _bodyRect.clone();
  3. }
  4. private var _bodyRect:Rectangle = new Rectangle;

复制代码

但是每次都clone()也就是每次重新new一个也会比较消耗性能,同时会产生大量的临时对象(也占点内存)。在一些密集计算的地方一次循环可能就会需要大量的使用类似的属性,也就是说会产生大量此类临时对象,而运算过后也都是直接丢弃。着实有点浪费。

于是我想到用一个read模式。比如针对上面例子中get bodyRect()声明一个 readBodyRect(_rect:Rectangle)方法,过程中不再产生新的Rectangle对象,而是接收一个Rectangle来修改其值。

  1. public function readBodyRect(_rect:Rectangle):void{
  2. _rect.x = _bodyRect.x;
  3. _rect.y = _bodyRect.y;
  4. _rect.width = _bodyRect.width;
  5. _rect.height = _bodyRect.height;
  6. }
  7. private var _bodyRect:Rectangle = new Rectangle;

复制代码

这样在一些密集计算的地方只要在循环外建立一个临时的Rectangle对象专门用来被重复修改即可。即提高了性能又保持了封装性。
那么大概能为我们节省多少性能呢?可以跑一下下面的测试程序

  1. import flash.geom.Rectangle;
  2. function getRectangle():Rectangle{
  3. return _rect.clone();
  4. }
  5. function readRectangle(_rect:Rectangle):void{
  6. _rect.x = 100;
  7. _rect.y = 100;
  8. _rect.width = 100;
  9. _rect.height = 100;
  10. }
  11. var _rect:Rectangle = new Rectangle;
  12. var _old:int = getTimer();
  13. for(var i:int = 0; i < 1000000; i += 1){
  14. getRectangle();
  15. }
  16. trace("正常模式:",getTimer() - _old);
  17. _old = getTimer();
  18. for(i = 0; i < 1000000; i += 1){
  19. readRectangle(_rect);
  20. }
  21. trace("read模式:",getTimer() - _old);

复制代码

最后,以上只是用Rectangle举的例子,在实际项目中可以使用地方还是比较多的,实际只要是需要密集计算频繁get的地方都可以使用。

转载于:https://www.cnblogs.com/chenhongyu/p/3290618.html

优化小技巧——复杂属性对象的read模式相关推荐

  1. Java中String对象的replaceAll方法调用性能优化小技巧

    Java中String对象的replaceAll方法调用性能优化小技巧 0x01 Java中String对象的replaceAll方法调用性能优化小技巧 1.1 What? 1.2 Why? 1.3 ...

  2. php get 传循环出来的参数_PHP性能优化小技巧

    PHP性能优化小技巧: 1. foreach效率更高,尽量用foreach代替while和for循环. 2. 循环内部不要声明变量,尤其是对象这样的变量. 3. 在多重嵌套循环中,如有可能,应当将最长 ...

  3. OI常用的常数优化小技巧

    注意:本文所介绍的优化并不是算法上的优化,那个就非常复杂了,不同题目有不同的优化.笔者要说的只是一些实用的常数优化小技巧,很简单,虽然效果可能不那么明显,但在对时间复杂度要求十分苛刻的时候,这些小的优 ...

  4. mysql百万级去重_mysql优化小技巧之去除重复项(百万级数据)

    mysql优化小技巧之去除重复项(百万级数据) 发布时间:2018-06-11 11:54, 浏览次数:482 , 标签: mysql 说到这个去重,脑仁不禁得一疼,尤其是出具量比较大的时候.毕竟咱不 ...

  5. 新网站关键词优化小技巧

    网站已经基本成为每家企业的标配了,在网站搭建好后,只有经过SEO优化才能达到良好的推广效果.而新网站想要快速取得关键词排名也不是那么容易的,下面老齐SEO就给大家介绍几点关于新网站关键词优化的小技巧. ...

  6. C4D新手党使用小技巧——如何给对象着色以及添加材质或贴图?如何输出PNG格式?

    ** C4D新手党使用小技巧--如何给对象着色以及添加材质或贴图?如何输出PNG格式? 1.打开C4D,新建球体或别的对象,C掉,添加细分曲面使得对象更圆滑 2.选中对象,查看右下角编辑器,有个颜色编 ...

  7. 嵌入式C语言优化小技巧

    嵌入式C语言优化小技巧 1 概述 嵌入式系统是指完成一种或几种特定功能的计算机系统,具有自动化程度高,响应速度快等优点,目前已广泛应用于消费电子,工业控制等领域.嵌入式系统受其使用的硬件以及运行环境的 ...

  8. JavaScript 工作原理之十一-渲染引擎及性能优化小技巧

    原文请查阅这里,略有删减,本文采用知识共享署名 4.0 国际许可协议共享,BY Troland. 本系列持续更新中,Github 地址请查阅这里. 这是 JavaScript 工作原理的第十一章. 迄 ...

  9. JavaScript 工作原理之十一-渲染引擎及性能优化小技巧 1

    原文请查阅这里,略有删减,本文采用知识共享署名 4.0 国际许可协议共享,BY Troland. 本系列持续更新中,Github 地址请查阅这里. 这是 JavaScript 工作原理的第十一章. 迄 ...

最新文章

  1. 数字证书采用公钥体制进行加密和解密。每个用户有一个私钥,用它进行 (46)。。。
  2. 【MySQL】MySQL表的增删改查(进阶-下)
  3. faster rcnn windows 下c++版本
  4. js中一些常用的基本函数
  5. 如何在linux下yum安装mysql_linux下使用yum安装mysql详解
  6. linux MISC 驱动模型分析
  7. iOS 九宫格手势密码
  8. 02_入门程序(非注解方式,了解)
  9. Process Kill Technology Process Protection Against In Linux
  10. PHP7.1 狐教程【旧】不在更新,请点击新连接查看
  11. python用逗号隔开输出_python思维导图入门第二篇,数据结构,精心整理
  12. 【单片机原理及应用】第一篇——单片机概述
  13. PyCharm自定义背景图片、更换主题
  14. 【Unity3D】报错 Some objects were not cleaned up when closing the scene.
  15. python list切片_python list切片
  16. 王者荣耀 微信登录 服务器找不到,王者荣耀微信登录失败怎么办 王者荣耀微信登录失败解决办法...
  17. 微信小程序的wxml实现复杂运算或者数据处理
  18. 二进制与十进制的相互转换
  19. 常见Cppcheck检查问题总结(静态检查错误)
  20. 如何从ADI官网下载PCB库

热门文章

  1. java的et5_Javascript与java相同的3des加密(使用etdesede/CBC/PKCS5Padding )
  2. 两组的数据平均值合并_不要进入数据陷进
  3. mysql 时间绝对值_datetime和timestamp--时间戳是绝对值,日期是相对值
  4. ios html5上架,iOS原生集成H5+详细流程
  5. 变量的初始化与使用C语言程序注释,c - (为什么)使用未初始化的变量未定义行为?...
  6. caffe开始训练自己的模型(转载并验证过)
  7. php 实现的n,php 实现数据N等分。
  8. Java中 List、Set、Map遍历方式以及性能比较
  9. 优秀的程序员VS糟糕的程序员
  10. 成功必读本:培养人脉的106个技巧