首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >代码设计:性能与可维护性

代码设计:性能与可维护性
EN

Stack Overflow用户
提问于 2015-08-04 18:37:11
回答 2查看 1.3K关注 0票数 4

语境化

Im正在使用测试上下文中的碳烟框架实现字节码工具,我想知道哪个设计更好。

我正在为我正在检测的类中的每个方法构建TraceMethod对象,并且我希望在多个类上运行这个工具器。

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

备选案文1:(地图)

代码语言:javascript
复制
public class TraceMethod {
    boolean[] decisionNodeList;
    boolean[] targetList;
    Map<Integer,List<Integer>> dependenciesMap;
    Map<Integer,List<Double>> decisionNodeBranchDistance;
}

备选案文2:(对象)

代码语言:javascript
复制
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比对象使用更多的内存,但我仍然不相信我的解决方案(选项2)更好。

这是一个简单的细节,但我想确定我使用的是最优的解决方案,我关心的是性能(时空)。我知道第二个选项在可维护性方面要好得多,但如果不是最优的话,我可以牺牲它。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-04 19:29:13

方法1具有更快的速度和更少的空间。

特别是对于字节码工具,我将首先实现方法1。

然后,当它工作时,用使用原语类型而不是Integer和Double对象的非泛型列表替换这两个列表。

注意,int需要4个字节,而Integer (对象)则需要16-20字节,这取决于机器( PC上16字节,android 20字节)。

这个列表可以替换为GrowingIntArray (我发现在Apache的一个统计包中,如果我记得正确的话),它使用原始的ints。(或者,一旦您知道内容不能再改变,就可以用int[]代替),然后编写您自己的GrowingDoubleArray (或者使用double[])。

记住,集合是方便的,但速度较慢。

对象使用的空间是原语的4倍。

字节码工具需要性能,它不是每周运行一次的软件。

最后,我不会用非泛型的地图来代替那个地图,这对我来说似乎是很大的工作。但你可以试着把它作为最后一步。

作为最后的优化步骤:查看列表或地图中有多少元素。如果这个值通常小于16 (您必须尝试一下),您可以切换到线性搜索,这是最快的,对于一个非常低数量的元素。您甚至可以使您的代码智能,以切换搜索算法,一旦元素的数量超过一个特定的数目。(Sun/Oracle这样做,Apple/ios在他们的一些集合中)。然而,最后一步将使您的代码更加复杂。

空间作为表象:

DecisionNode: 16用于类+4 (id) + 20 (Double) +4(布尔值)= 44 +4填充,然后再加上8= 48字节的下一个倍数。

票数 1
EN

Stack Overflow用户

发布于 2015-09-09 05:42:39

一般来说,你应该经常进行维护,而不是假设的性能。这样做的理由不多:

  • 我们倾向于对数组与HashMap之间的速度差异着迷,但在实际的企业应用程序中,这些差异并不足以解释应用程序速度的明显差异。
  • 应用程序中的大多数常见瓶颈都存在于数据库或网络中。
  • JVM在一定程度上优化了代码

由于可维护的代码,您的应用程序不太可能出现性能问题。更有可能的情况是,当您有数百万行不可维护的代码时,您的老板将耗尽资金。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31816774

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档