2017-02-22 62 views
1

问题: 将对象包装到另一个对象内的性能成本是多少?内存和CPU使用率均从直接调用对象增加。包装的性能代码

附加信息: 我正在开发一个框架,它将封装代码以隔离插件与程序的核心实现。这个问题不断涌现在我的脑海中“性能成本是多少”。我知道这不仅仅是直接访问被封装的代码。但是,我似乎无法在网上找到任何可靠来源或数据,以准确显示预期的结果。这是一个问题,因为我正在开发这个项目来替代大约40个项目的实现。因此,当被问及更新期望的开销水平时,我需要有一些数据。

此外,如果有人不确定我的意思是包装的代码。这是一个使用一个接口创建对象的过程,该接口将所有方法调用发送到存储在对象中的对象。这是为了在原始对象不能被修改或改变以包含接口时隐藏对象的实现。以下是我正在谈论的一个例子。

public class WrapperObject implements WrapperInterface 
{ 
    private SomeObjectClass theObject; 

    public WrapperObject(SomeObjectClass theObject) 
    { 
     this.theObject = theObject; 
    } 

    public void method1() 
    { 
     theObject.method1(); 
    } 

    public void method2() 
    { 
     theObject.method2("someData", 1); 
    } 
} 

我也知道JIT在Java和其他优化技术JVM中的作用。我问我可以期望从一个大型项目使用这样的系统开销。正如我在包装或转换插件代码之前所做的一切。这包括可能被称为每秒几千次的方法以及仅调用一次的方法。

我也将在接下来的几天内构建原型来测试性能。我只是寻找一些设计意见,以更好地理解期望。而不是盲目地看我的代码猜测浪费时间。

+1

衡量它,不要作假设。如果JIT决定内联或直接调用包装对象,则性能成本可能为0。 – john16384

+0

正如我所说我知道关于JIT,我没有做出假设。我打算对原型进行测试。我正在寻找的是一些知识来帮助解释我所看到的。这样我就不会做出假设并猜测发生了什么。 – DarkGuardsman

+0

如果包装对象的性能成本是一个问题,那么你最好放弃面向对象编程。这是你在Java中应该担心的最后一件事。 – jaco0646

回答

1

很难估计性能/ CPU消耗,因为它实际上取决于您将如何处理该对象以及如何处理它们。但是你可以相对较好地测量RAM的消耗。

没有进入详细信息,可以测量物体作为

  • 大小标头(16 bytes为64位JDK)
  • 大小原始部件(发现在the documentation大小)
  • 的总和的大小参考成员的大小(用于64位JDK的8 bytes
  • 偏移量大小(用于均衡的几个字节)

您的特定对象将包含标题,一个引用和偏移量。

注意这是近似值,确切的大小取决于很多其他因素,但它会帮助您设想将消耗多少内存。

有关不同类型的大小更多的细节来看看on this question

+0

谢谢,这将帮助很好。你至少在猜测CPU部分? – DarkGuardsman

+0

即使猜测也很难,因为可能有影响性能的因素(从应用程序的用例到垃圾收集器策略)。我可以建议的唯一事情是阅读所有关于Java内存模型并分析你的用例。你可以从[this]开始(https://dzone.com/articles/java-performance-tuning) –

+0

谢谢,我会在这里稍微阅读一下,看看它是否有帮助:) – DarkGuardsman