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

css阴影属性

这是“ 影子字段属性访问器”界面的 第3轮 。 如果您是新手,但不确定要怎么做,请查看我以前的文章或关于开发JavaFX应用程序时节省内存的第一篇文章 。 作为Java开发人员,我主要关心的是在开发JavaFX域模型时在性能内存使用和降低模板代码(简化API使用)之间取得良好的平衡。 通常,应用程序框架提供模型视图控制器(MVC)或表示模型模式以将UI代码与域对象分开。 实际上,想到的是域模型类型对象应该易于创建或生成( IDE )。 在此博客条目中,您将看到第3轮的结果,其中包括两个部分 。 第1部分是使用Marcel Heckel的想法实现的,第2部分是我根据性能内存使用易用性最终付诸实践的实现。

  • 免责声明:使用任何代码均需自担风险。 这纯粹是实验性的,不应在生产中使用。 这是一项正在进行的工作。

最新的代码在这里-> [ PropertyAccessors接口 ]

第二轮回顾

尽管上一轮( 第2轮 )表明我的Property Accessors策略在内存消耗方面比标准(fat)特性对象策略稍好,但是在创建2,000,000个具有本地类型的Employee类型类的对象时,在性能方面仍然令人失望输入对象 。 与Dirk的实现相比,我对第二轮实现的内存使用仍然不满意。 如果您只关心我在第3轮中的最终成绩,请跳至“ 结果”部分。

因为,可能会有新的回合,如果您决定使用它,或者假设Dirk决定接受我的拉取请求,请转到此处以查看他的Github帐户。

在第2轮中,我使用了一个哈希映射查找,它会很慢,因为越来越多的字段以O(1)时间复杂度(搜索)添加 。 有趣的是,Marcel Heckel提出了一种创建对象索引数组的简单方法,该方法不仅可以节省更多内存,而且速度更快。 与键/值对查找相比,直接访问字段绝对是必经之路。 尽管Marcel的代码速度更快,但它仍然比Dirk的Shadow Fields代码占用更多的内存。 额外的内存实际上是通过预分配一个数组来占用的,该数组将保存每个字段的值。 即使它们全部为null ,也会为每个员工对象创建数组本身。 我在这里实施了Marcel的策略(第23行)。 让我们看一下索引字段数组策略的结果。

第1部分:使用索引字段数组

private final Object[] modelProperties =new Object[FIELDS.values().length];public Object[] getModelProperties(){return modelProperties;}

测试:对象不使用属性字段

下面显示的是混合使用Marcel的索引数组思想和我使用枚举类型指定属性名称以将字段表示为属性字段的方式。

screen-shot-2016-04-07-at-12-18-01-am

与所有字段均作为JavaFX属性的标准(胖)对象相比,未使用JavaFX属性的对象。 此实现为每个字段使用一个数组索引,并为每个值使用一个数组。

在上方,您会注意到未选中该复选框,以指示不要在域对象上创建JavaFX 属性不使用xxxxProperty()方法 )。 您会注意到,与第二回合的代码相比,性能得到了显着提高,并且内存使用量也有所减少。 在上图中, Property Accessor界面Shadow Fields的模式实现大16MB 。 在瘦对象​​性能和内存使用的第1部分中, Shadow Fields是明显的赢家。 但是,Shadow Fields仍然不太干净。 还要注意的另一件事是,对于200万个对象,Property Accessors接口仅不到14毫秒! 正如我们将在第2部分稍后将带回专用实例变量作为字段所看到的那样 ,Property Accessors接口确实会随着内存的使用而发光。

测试:对象使用属性字段

以下是当对象的所有字段都使用JavaFX属性时的结果。

screen-shot-2016-04-07-at-12-24-22-am

将使用JavaFX属性的对象与所有字段都作为Javafx属性的标准(胖)对象进行比较。 此实现为每个字段使用一个数组索引,并为每个值使用一个数组。

在这里,您会注意到200万个对象的Accessor列(Property Accessors接口)在916毫秒内使用576 MB的内存执行。 在这种情况下,就544 MB的内存空间而言,标准(胖)对象是获胜者。 到目前为止,Shadow Fields在每一轮比赛中都表现出色。

Marcel的代码示例 (在注释部分)的一个小细节是,在创建新的属性对象实例时,它没有考虑属性的字符串名称 。 例如,以下语句显示变量totalProperty ,其属性名为“ total ”,该属性与totalProperty()方法匹配。 在更改期间触发属性名称对于读取代码,测试和工具很重要。

属性totalProperty = new SimpleIntegerProperty(this,“ total”,new Integer(5));

为了同时拥有一个命名字段和一个类似于Marcel的想法的索引,我只创建了一个枚举来声明每个字段的属性。 这些枚举在Employee类上创建。

// Part 1 implementation
public class EmployeePropertyAccessor implements PropertyAccessors{public enum FIELDS {name,powers,supervisor,minions}private final Object[] modelProperties =new Object[FIELDS.values().length];public Object[] getModelProperties(){return modelProperties;}// The rest of the code...

在上面,您会注意到如何基于已定义字段(枚举FIELDS)的数量创建模型Properties数组。 我使用FIELDS.value()。length定义数组的大小。 同样, PropertyAccessors接口( 第1部分的实现 )强制开发人员实现getModelProperties()方法。 在这里,我只是返回对对象数组的modelProperties引用。 “ 必须 ”实现一个数组和一个getModelProperties()方法并不是一件很愉快的事情

在本文的第2部分中,我以不同的方式实现了一些事情,其中​​开发人员没有被迫实现modelProperties数组和getModelProperties()方法。 我将解决此问题,使代码看起来更简洁,性能更好(API观点的用户)。

第2部分:重新引入实例变量

在第2部分中,我将把私有实例变量重新添加到Employee类( EmployeePropertyAccessor )中,以保存字段值,而不是像第1部分中那样的数组。类型或JavaFX属性,从而与“影子字段”模式代码相比节省了内存。 由于“ 阴影字段”代码使用两个变量来表示字段值,因此它将具有一个额外的引用,当对象使用属性时,该引用将不可避免地增加其内存。 正如您在下面看到的那样,代码看起来与第1部分相似,但也将具有一个静态块以在类中注册属性字段。 这很重要,因为您可能不希望某些实例变量作为JavaFX属性参与。

// Part 2 implementation
public class EmployeePropertyAccessor implements PropertyAccessors {private Object name;private Object powers;private Object supervisor;private Object minions;enum FIELDS {name,powers,supervisor,minions}static {// register fields one time.// (Warning: enum's ordinal value is reassigned an index number)registerFields(EmployeePropertyAccessor.class, FIELDS.values());}public EmployeePropertyAccessor(String name, String powers) {setName(name);setPowers(powers);}public final String getName() {return getValue(FIELDS.name, "");}public final void setName(String name) {setValue(FIELDS.name, name);}public final StringProperty nameProperty() {return refProperty(FIELDS.name,
SimpleStringProperty.class, String.class);}// The rest of the code...

上面的代码清单在调用registerFields()方法时做了一些有趣的魔术 。 使用反射重新分配 FIELDS枚举的序数值,从而为每个枚举赋予一个新的id作为数组的索引。 这提供了不可变的枚举,同时还包含要通过索引快速访问的每个字段的唯一标识符。 由于枚举用于表示要用作属性的字段,因此序数值在其他上下文中没有意义。 这意味着:谁在乎,是否在这些声明的枚举上重新分配了序数值? 它们仅用于“ 注册字段 ”。

测试:不使用属性字段的对象[NEW]

下面显示的是使用Property Accessors接口API的新实现的测试结果。 下面的测试显示与标准胖对象相比,何时不使用属性字段。

将标准对象(使用属性的所有字段)与使用本机对象的对象进行比较的测试。现在,Property Accessors接口API使用实例变量作为字段,而不是对数组的引用。

将标准对象(使用属性的所有字段)与使用本机对象的对象进行比较的测试。 现在,Property Accessors接口API使用实例变量作为字段,而不是对数组的引用。

正如您在上面看到的那样,Property Accessors接口的新实现显然是内存使用率和易用性的赢家。 性能比第1部分的实现稍慢,但是节省内存是值得的。 您会注意到,“影子字段”的内存使用量比“属性访问器”的使用量多16 MB。

测试:对象使用属性字段[NEW]

下面显示的是使用Property Accessors接口API的新实现的测试结果。 下面的测试显示与标准脂肪对象相比,何时使用属性字段。 (在“开始”按钮下方选中了该复选框)

screen-shot-2016-04-09-at-12-36-02-pm

第三回合的结果

以下是我根据表格中的结果汇总在一起的条形图。 我觉得人们喜欢看图表而不是表格,单元格和文本。

performance_a

对象不使用JavaFX属性时的性能测试结果。 较小的数字(以毫秒为单位)更好。

performance_b

对象使用JavaFX属性时的性能测试结果。 较小的数字(以毫秒为单位)更好。

memusage_a

对象不使用JavaFX属性时的内存使用情况测试结果。 较小的数字(以兆字节为单位)更好。

memusage_b

对象使用JavaFX属性时的内存使用情况测试结果。 较小的数字(以兆字节为单位)更好。

结论

根据结果​​,我的目标得到了明确的实现 (IMHO),我最初希望代码在对象可能使用或不使用JavaFX属性时都易于阅读并且易于实现( 当字段不使用JavaFX时还可以节省内存)属性[本机类型] )。 尽管在所有测试运行中都赢得了性能方面的Shadow Fields的认可,但Property Accessors界面并没有落后。 当不使用属性时,在创建200万条记录时,Property Accessors界面仅比标准对象策略短5毫秒。

对于创建200万个对象的内存使用情况,以及策略未使用属性作为字段的情况,“ 属性访问器”界面显然是赢家,与“影子字段”模式相比至少节省16MB,与“阴影字段”模式相比节省240MB。标准属性代码。 最后但并非最不重要的一点是,当对象将属性用作字段时,Property Accessors接口将与标准对象策略有关的内存消耗联系起来。 Shadow Fields策略使用的内存至少比其他策略多20MB。

尽管在使用不使用所有字段作为200万个对象的属性时,Properties Accessors接口会稍微慢一些(以毫秒为单位的微小差异),但我相信该API可以在任何JavaFX应用程序大小上使用,以简化域的开发模型和对象。 我鼓励其他人在决定使用API​​之前先测试代码。 请注意,该代码不适合生产,并且处于试验阶段。 这是一项正在进行中的工作,因此,在我开始吃自己的狗食(工作时)之前,我真的不能建议您使用Property Accessors API。 我将在下面重申免责声明:

  • 免责声明:使用任何代码均需自担风险。 这纯粹是实验性的,不应在生产中使用。 这是一项正在进行的工作。

随时发表评论和订阅。 享受快乐的编码!

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

css阴影属性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/336103.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js if判断多个条件_JS条件判断小技巧(一)

经常code review,我发现JS newbie很容易写出一堆冗长的代码。今天就列几个比较常见的“解决之道”,看看如何减少JS里的条件判断。提前返回,少用if...else“if...else是编程语言的精华。——鲁迅”但是过多的嵌套,还是挺令人抓狂的…

【Android OpenGL ES 开发 (四)】纹理相关(一)

纹理贴图的原理 1.作用:可以用来渲染视频。 2.纹理坐标 生成OpenGL中的纹理对象 1.像素数据想要绘制出来需要先变成纹理 2.创建纹理放在GPU上 GLuint CreateTexture2D(unsigned char *pixelData,int width,int height,GLenum type) {GLuint texture;glGenTextu…

jmx 替代_使用JMX作为Ganglia的现代替代品进行CLDB监视

jmx 替代有许多选项可用于监视MapR集群的性能和运行状况。 在本文中,我将介绍使用Java管理扩展(JMX)监视CLDB的鲜为人知的方法。 据最受尊敬的MapR数据工程师之一,Akihiko Kusanagi称,与使用Ganglia相比,使…

red hat安装宝塔_如何在几分钟内安装Red Hat Container Development Kit(CDK)

red hat安装宝塔作为负责开发容器化应用程序提供的可能性的应用程序开发人员或架构师,将所有工具组合在一起以帮助您入门时几乎没有帮助。 到现在。 红帽容器开发套件(CDK) 安装变得简单! 红帽提供了一个容器开发套件&#xf…

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

threejs 影子属性如果你们还没有注意到Dirk Lemmerman和我之间的(轻松) 摊牌 ,那么让我快速提及一下我们是如何做到这一点的。 首先,Dirk创建了JavaFX技巧23:“ 为属性保存内存阴影字段 ”,以帮助应用程序开…

【OpenGL从入门到精通】Shader专题

详解GPU的工作流程 1.shader通常称为着色器,作用是把CPU上的点渲染出来。 2.shader是并行的。 3.流程:数据data (顶点数据) ----->VS(输入:data的顶点数据,输出:gl_Position的 vec4 顶点数据)----->光栅化处理…

【OpenGL从入门到精通(六)】纹理对象与纹理坐标

1.在OpenGL想要显示一张图片,需要先绘制一个自定义的几何体。 2.把图片加载到纹理对象中 3.当进行纹理贴图时候,使用纹理坐标来设置纹理对象。 2.

yeoman_具有Spring Boot和Yeoman的单页Angularjs应用程序

yeoman我非常感谢yeoman之类的工具,这些工具提供了一种非常快速的方法来将不同的javascript库组合在一起成为一个一致的应用程序。 Yeoman提供了UI层,如果您需要开发服务层和静态资产的Web层,则打包的一种好方法是使用Spring Boot 。 我知道有…

双向链表删除节点时间复杂度_「十分钟学算法」删除链表的倒数第N个节点

给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。示例:给定一个链表: 1->2->3->4->5, 和 n 2.当删除了倒数第二个节点后,链表变为 1->2->3->5.说明:给定的 n 保证是有效的。题解…

netbeans连接数据库_NetBeans Java EE技巧3:数据库中的RESTful Web服务

netbeans连接数据库许多现代的Web应用程序正朝着使用HTTP使用无状态通信的方向发展。 REST(表示状态转移)体系结构样式通常用于设计网络应用程序,而使用Java EE 7,很容易开发用于数据库通信的RESTful后端。 使用简单的POJO&#x…

knn算法python代码_K-最近邻分类算法(KNN)及python实现

一、引入问题:确定绿色圆是属于红色三角形、还是蓝色正方形?KNN的思想:从上图中我们可以看到,图中的数据集是良好的数据,即都打好了label,一类是蓝色的正方形,一类是红色的三角形,那…

rxjava 并行_使用RxJava和Completable并行执行阻塞任务

rxjava 并行通过RxJava 1.1.1中引入的Completable抽象,如何并行执行阻止“仅副作用”(也称为void)任务的并行执行变得更加容易。 “ 正如您可能已经注意到,阅读我的博客时,我主要专注于软件Craft.io和自动代码测试。 …

系统工程师主要做什么_Filecoin运维工程师在做什么?

前言固然运维这个职能范畴对于绝大多数人来说认知模糊,特别是在分布式存储领域,“运维”常常和“机房”“IDC”等名词相伴,导致很多异业者对于运维的了解停留在物理层面,以搬运机器、上下架服务器、管理网电等为标杆,好…

mysql怎么返回上一行_月球上并没有发射基地,阿波罗飞船是怎么返回地球的?...

美国上世纪六七十年代成功实施了载人登月工程,这一壮举震惊世界。阿波罗系列载人登月飞船和用于发射飞船的土星五号运载火箭名声大噪,而用于发射土星五号,位于卡纳维拉尔角肯尼迪航天发射中心的39号发射台也格外引人瞩目。土星五号全长110多米…

凯立德地图导航2020年最新版车载_明明有车载导航,为什么很多人还是选择用手机导航?有5个原因...

提到导航,你首先会想到什么导航产品呢?如果是高德导航、百度导航之类的,那你主要用手机导航。但是如果除了高德导航和百度导航之外,你还能随口说出四维图新导航、凯立德导航,甚至是道道通导航之类的话,那你…

WebRTC Google的 BBR拥塞控制算法解析

正文之前,给出本文的图例: BBR的组成 bbr算法实际上非常简单,在实现上它由5部分组成: 1.即时速率的计算 计算一个即时的带宽bw,该带宽是bbr一切计算的基准,bbr将会根据当前的即时带宽以及其所处的pipe状态来计算pacing rate以及cwnd(见下文),后面我们会看到,这个即时…

python斐波那契数列前20项_兔子繁殖问题带来的智商碾压:斐波那契数列趣谈

本文来自公众号:超级数学建模微信号 :supermodeling原文标题:斐波那契数列趣谈via 善科by BB一般认为斐波那契数列的提出是基于兔子的繁殖问题:如果一开始有一对兔子,它们每月生育一对兔子,小兔在出生后一个…

jboss使用_使用JBoss Cool Store的终极云零售指南

jboss使用我们一直在讨论为什么应用程序开发人员在App Dev Cloud Stack系列中不能再忽略其堆栈了。 带有JBoss Cool Store的App Dev Cloud 我们从头到尾讨论了各个层次,但尚未为您提供除Red Hat Container Development Kit(CDK)之外的任何应…

C++ 11 深度学习(六)智能指针综述

以下三种智能指针均为类模板 1.shared_ptr 共享指针 ,多个指针指向同一个对象,最后一个指针被销毁时,这个对象会被释放。 2.week_ptr 是辅助shared_ptr工作的 3.unique_ptr 是独占式指针,同一时间只能有一个指针能指向该对象…