卡尔·迪亚(Carl Dea)最近跟踪了我的一篇名为“ 保存内存”的博客文章! 为属性使用阴影字段 。 在他的博客中,他建议使用一个称为“属性访问器”的接口来消除使用阴影字段所需的大量样板代码。 卡尔还提到他尚未用大量数据测试他的方法,他或某些读者可能会跟进性能比较。 所以它来了。

我编写了一个小型测试应用程序,该应用程序实现了卡尔在他的帖子中提到的三种策略:

  1. 在类被实例化的同时实例化的标准属性
  2. 卡尔建议的属性访问器接口
  3. 我最近的博客文章中提出的阴影区域

该代码可以在GitHub上找到 。 (运行它时,请确保将初始堆大小和最大堆大小设置为2048 MB -ms2048m -mx2048m,否则内存分配会弄乱结果)。

该应用程序允许用户在有或没有要求属性的情况下执行这些策略。 它测量花费的时间和使用的内存。 应该注意的是,由于我使用System.currentTimeInMillis()Runtime.gc() ,因此测量结果不科学。 当运行几次时,我仍然会认为这些测试的质量值是可以接受的。

下面的第一个屏幕截图显示了当您创建1,000至2,000,000个Carl用于其博客的Employee类实例时获得的数量。 测试不要求提供雇员可用的属性(姓名,权力,主管,奴才):

如您所见,“影子字段”策略是最快的,并且使用的内存量最少。 这是有道理的,因为“标准属性”策略总是创建那些胖属性对象,而“属性访问器接口”在内部管理每个模型对象的哈希映射。 只有“影子字段”策略才能使用最少的数据结构。 对于选定的测试,它总共可以节省230 MB。 现在,如果您想象典型的应用程序具有许多模型类,并且其中许多类都比Employee测试类复杂得多,那么您可以想象可以节省多少内存。

下一个屏幕截图显示了在访问Employee类中的所有四个属性和可观察对象时所进行的测量。

现在,“标准属性”策略是最快的,也是使用最少内存的策略。 再次讲得通,因为该策略现在针对给定的用例实现了完美的方法。 但是,“影子域”策略排在第二位。

结论

“属性访问器接口”策略成功地减少了阴影场所需的所有样板代码所产生的噪声,但是我认为这样做的代价太高了,无法为创建多个模型对象的任何应用程序付钱。

PS:应该注意的是,当JVM的初始堆大小保留为其默认设置时,该比较甚至更支持“影子字段”策略。 在这种情况下,测试应用程序必须不断要求更多的堆空间,这是一项相当昂贵的操作。

翻译自: https://www.javacodegeeks.com/2016/04/shadow-fields-vs-property-accessor-interface.html

影场与属性访问器界面相关推荐

  1. ssm影城项目_影场与属性访问器界面

    ssm影城项目 卡尔·迪亚(Carl Dea)最近跟踪了我的一篇名为" 保存内存"的博客文章! 为属性使用阴影字段 . 在他的博客中,他建议使用称为"属性访问器" ...

  2. threejs 影子属性_影子场vs.属性访问器接口第2轮

    threejs 影子属性 如果你们还没有注意到Dirk Lemmerman和我之间的(轻松) 摊牌 ,那么让我快速提及一下我们是如何做到这一点的. 首先,Dirk创建了JavaFX技巧23:" ...

  3. 影子场vs.属性访问器接口第2轮

    如果你们还没有注意到Dirk Lemmerman和我之间的(轻松) 对决 ,那么让我快速提及一下我们是如何做到这一点的. 首先,Dirk创建了JavaFX技巧23:" 为属性保存内存阴影字段 ...

  4. css阴影属性_第三场阴影场与属性访问器接口

    css阴影属性 这是" 影子字段与属性访问器"界面的 第3轮 . 如果您是新手,但不确定要怎么做,请查看我以前的文章或关于开发JavaFX应用程序时节省内存的第一篇文章 . 作为J ...

  5. 第三场阴影场与属性访问器接口

    这是" 影子字段与属性访问器"界面的 第3轮 . 如果您是新手,但不确定要怎么做,请查看我以前的文章或关于开发JavaFX应用程序时节省内存的第一篇文章 . 作为Java开发人员, ...

  6. 【Kotlin】属性 与 幕后字段 ( 属性声明 | 属性初始化器 | 属性访问器 | field 属性幕后字段 | lateinit 延迟初始化属性 )

    文章目录 I . 属性 字段 总结 II . 属性声明 III . 属性初始化器 IV . get / set 属性访问器 V . 属性幕后字段 field VI . 变量和常量的区别 VII . 延 ...

  7. 属性访问器(Property Accessor)----Setter/Getter

    Setter/Getter:属性/成员变量的封装 本质上是实例方法,但是在类的外部作为属性来访问,它允许创建只读和只写属性. 使用: getter方法:必须有返回类型,且和要访问的私有属性类型一致.必 ...

  8. 《js高级程序设计》6.1.1-6.1.3——数据属性、访问器属性

    数据属性:该属性包含了一个数据值的位置,它包含了4个描述行为的特性: 1. [[Configurable]]:表示是否能通过delete删除属性从而重新定义属性,能否修改属性的特性,能否把属性修改为访 ...

  9. JS-数据属性与访问器属性

    数据属性与访问器属性 1.对象属性的作用主要是数据的存储 2.既然数据存在存储,则会有增删改查相关操作(增加属性,修改属性值,获取属性值,删除属性) 3.数据属性用于控制属性的增删改查特征 4.访问属 ...

最新文章

  1. dataconnectiondialog mysql_MySQL的DataConnectionDialog
  2. Python快速入门(1)
  3. 超炫的iphone应用UI/UX设计赏析
  4. 数组精选题目三连(6)
  5. java的课后作业咋写_写的简单的java第三季的课后作业
  6. Android Activity中状态保存机制
  7. 【原】母版页、皮肤、导航 那点事 Master Pages Themes and Navigation Controls FAQ
  8. verilog学习记(快速入门)
  9. Linux系统启动流程和GRUB解释
  10. java ajaxsubmit_jQuery form插件之ajaxForm()和ajaxSubmit()的可选参数项对象
  11. 家庭影院的Dolby音效如何设置
  12. 破天服务器的系统,《新破天一剑》束缚系统
  13. 2017中国云计算评测报告
  14. NOI-C语言编程基础之循环控制——药房管理
  15. Goland环境下同一个package下出现undefined
  16. 基于微信小程序的核酸检测系统源码
  17. C++怎样获取当前系统时间?
  18. 002-全屏视频背景
  19. text-davinci-002与 text-davinci-003 有什么不同?
  20. 【博学谷学习记录】超强总结,用心分享 | 【Java】 Maven

热门文章

  1. Oracle入门(十)之概要文件
  2. Spring MVC表单防重复提交
  3. System.gc()调用 - 适用的场景
  4. Hibernate: You have an error in your SQL syntax; check the manual that corresponds to your MySQL
  5. shell文本处理工具grep
  6. php划分年龄段,儿童时期是怎样划分年龄阶段的
  7. python queue 生产者 消费者_【python】-- 队列(Queue)、生产者消费者模型
  8. 转-Redis AOF 持久化详解
  9. Java 泛型实现方法 — 擦拭法
  10. 清洁代码_清洁单元测试