Java代码的维护与更新,java – 代码设计:性能与可维护性

语境化

我正在测试上下文中使用soot框架实现字节码指示器,我想知道哪个设计更好.

我正在为我正在检测的类中的每个方法构建TraceMethod对象,并且我想在多个类上运行此指令器.

哪个选项提供更高的性能(时空)?

选项1 :(地图)

public class TraceMethod {

boolean[] decisionNodeList;

boolean[] targetList;

Map> dependenciesMap;

Map> decisionNodeBranchDistance;

}

选项2 :(对象)

public class TraceMethod {

ArrayList targets = new ArrayList();

ArrayList decisionNodes = new ArrayList();

}

public class DecisionNode {

int id;

Double branchDistance;

boolean reached;

}

public class Target {

int id;

boolean reached;

List 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字节的倍数.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值