ssm影城项目
卡尔·迪亚(Carl Dea)最近跟踪了我的一篇名为“ 保存内存”的博客文章! 为属性使用阴影字段 。 在他的博客中,他建议使用称为“属性访问器”的接口来消除大量使用样板代码所需的样板代码。 卡尔还提到他尚未用大量数据测试他的方法,他或某些读者可能会跟进性能比较。 所以它来了。
我编写了一个小型测试应用程序,该应用程序实现了卡尔在他的帖子中提到的三种策略:
- 在实例化类的同时实例化的标准属性
- 卡尔建议的属性访问器接口
- 我最近的博客文章中提出的阴影区域
该代码可以在GitHub上找到 。 (运行它时,请确保将初始堆大小和最大堆大小设置为2048 MB -ms2048m -mx2048m,否则内存分配会弄乱结果)。
该应用程序允许用户在询问或不询问属性的情况下执行这些策略。 它测量花费的时间和使用的内存。 应该注意的是,由于我使用System.currentTimeInMillis()和Runtime.gc() ,因此测量结果不科学。 当运行几次时,我仍然会认为这些测试的质量值是可以接受的。
下面的第一个屏幕截图显示了当您创建1,000至2,000,000个Carl用于其博客的Employee类实例时获得的数量。 测试不会要求提供Employee可用的属性(姓名,权力,主管,奴才):
如您所见,“影子字段”策略是最快的,并且使用的内存量最少。 这是有道理的,因为“标准属性”策略总是创建那些胖属性对象,而“属性访问器接口”在内部管理每个模型对象的哈希映射。 只有“影子域”策略才能使用最少的数据结构。 对于选定的测试,它总共可以节省230 MB。 现在,如果您想象典型的应用程序具有许多模型类,并且其中许多类都比Employee测试类复杂得多,那么您可以想象可以节省多少内存。
下一个屏幕截图显示了当还访问Employee类中的所有四个属性和可观察对象时所进行的测量。
现在,“标准属性”策略是最快的,也是使用最少内存的策略。 再次讲得通,因为该策略现在针对给定的用例实现了完美的方法。 但是,“影子域”策略排在第二位。
结论
“属性访问器接口”策略成功地减少了阴影场所需的所有样板代码所产生的噪声,但我认为这样做的代价太高了,无法为创建多个模型对象的任何应用程序付钱。
PS:应该注意的是,当JVM的初始堆大小保留为其默认设置时,该比较甚至更支持“影子字段”策略。 在这种情况下,测试应用程序必须不断要求更多的堆空间,这是一项相当昂贵的操作。
翻译自: https://www.javacodegeeks.com/2016/04/shadow-fields-vs-property-accessor-interface.html
ssm影城项目