Java中接口调用的优化策略

时间:2011-03-27 19:29:51

标签: java performance optimization interface design-patterns

我有一个使用提供者模式的应用程序。应用程序通过调用应用程序定义的接口来利用提供程序实现。

我正在研究如何围绕接口调用优化我的应用程序。

我可以将应用程序的复杂性限制为以下内容:

  1. 我只需要在启动时动态加载实现
  2. 我一次只需要为应用程序实例的一组特定接口实现一个提供程序实现。
  3. 我很感激人们付诸实践的任何策略:

    1. 减少接口调用
    2. 直接调用接口实现类的任何技巧。
    3. 各种方法可以更好地利用任何编译器优化。
    4. 谢谢!

2 个答案:

答案 0 :(得分:3)

这里有一些错误观念值得解决。

  1. 您可以通过直接调用底层具体实现(或使用抽象类)来减少接口调用。当它简化设计并提高可维护性时,应该这样做(通常更多接口有帮助,但是并非总是如此)

  2. 您可以将接口引用强制转换为具体引用,然后使用它。这通常是糟糕的编程实践,对性能影响不大。一般来说,只有正确地进行重构才能实现这一目标。 (它不是一个好的设计方法,但可以是一个务实的方法)

  3. 编译器不会以任何重要方式优化代码。它可以做的少数优化(例如内联编译时常量),你可能没有。 JVM在运行时执行有用的优化。再猜测JVM将做什么并尝试优化代码是一个跟踪和错误过程。如果你尝试了10个你认为应该有帮助的东西,1会使它显着加快,6会产生很小的差异,3会使它变慢。即简单代码往往最佳优化。

  4. 与C ++不同,大多数JVM可以优化虚拟功能的成本,尤其是当实际使用的实现只有一两个时。即它可以根据代码的使用方式优化代码,而不是编译器可以静态确定的代码。

答案 1 :(得分:1)

听到它的声音,你做错了。

  1. 精心设计的界面可以减少而不会增加应用程序的复杂性。通常与提供程序一起使用的接口应该有助于区分系统。如果您觉得直接访问实现会更简单,那么您的接口可能需要重新设计。

  2. “接口调用”的运行时开销非常小,以至于您不可能处于工作系统和非工作系统之间的区别。

  3. 一般来说,Java编译器本身的优化很少。它的大部分发生在运行时,因此代码越“自然”,JIT编译器就越能处理它。如果您尝试使用技巧来强制进行此优化或(例如手动内联代码或重用变量),则可能会导致代码速度变慢。

  4. 总结一下;如果您想降低应用程序的复杂性,请确保您的模块在应有的位置分开(模块之间的依赖关系越少越好),并使用代码分析工具来跟踪复杂性指标。