java – 代码设计:性能与可维护性
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 代码设计:性能与可维护性,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2047字,纯文字阅读大概需要3分钟。
内容图文
语境化
我正在测试上下文中使用soot框架实现字节码指示器,我想知道哪个设计更好.
我正在为我正在检测的类中的每个方法构建TraceMethod对象,并且我想在多个类上运行此指令器.
哪个选项提供更高的性能(时空)?
选项1 :(地图)
public class TraceMethod {
boolean[] decisionNodeList;
boolean[] targetList;
Map<Integer,List<Integer>> dependenciesMap;
Map<Integer,List<Double>> decisionNodeBranchDistance;
}
选项2 :(对象)
public class TraceMethod {
ArrayList<Target> targets = new ArrayList<Target>();
ArrayList<DecisionNode> decisionNodes = new ArrayList<DecisionNode>();
}
public class DecisionNode {
int id;
Double branchDistance;
boolean reached;
}
public class Target {
int id;
boolean reached;
List<DecisionNode> dependencies;
}
我自己实施了选项2,但我的老板建议我选择1,他认为这是“更轻”.我在本文“Class Object vs Hashmap”中看到HashMaps使用的内存多于Objects,但我仍然不相信我的解决方案(选项2)更好.
它是一个简单的细节,但我想确定我使用的是最佳解决方案,我关心的是性能(时空).我知道第二种选择在可维护性方面更好,但如果它不是最优的,我可以牺牲它.
解决方法:
方法1具有更快速且使用更少空间的强大功能.
特别是对于字节码指示器,我首先实现方法1.
然后当它工作时,将两个列表替换为使用原始类型而不是Integer和Double对象的非泛型列表.
注意,int需要4个字节,而Integer(Object)需要16到20个字节,具体取决于机器(PC上16个,android下20个).
可以使用GrowingIntArray替换List(我已经在Apache的统计包中找到了,如果我记得正确的话),它使用了原始的int. (或者一旦你知道内容不能再改变,或者只是用int []替换)
然后你只需编写自己的GrowingDoubleArray(或使用double [])
记住收藏很方便,但速度较慢.
对象使用的空间比基元多4倍.
字节码指示器需要性能,它不是每周运行一次的软件.
最后,我不会用非通用的地图替换那个地图
对我来说很多工作.但你可以尝试它作为最后一步.
作为最后的优化步骤:查看列表或地图中有多少元素.如果它通常小于16(您必须尝试),您可以切换到线性搜索,
对于数量非常少的元素,这是最快的.
一旦元素数量超过特定数量,您甚至可以使代码智能化以切换搜索算法.
(Sun / Oracle java在他们的一些集合中执行此操作,以及Apple / ios).
但是,最后一步将使您的代码更加复杂.
空间作为例外:
DecisionNode:16表示类4(id)20(双精度)4(布尔值)= 44 4填充然后下一个8 = 48字节的倍数.
内容总结
以上是互联网集市为您收集整理的java – 代码设计:性能与可维护性全部内容,希望文章能够帮你解决java – 代码设计:性能与可维护性所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。