【问题标题】:Performance overhead of casting from interface to implementation class从接口转换为实现类的性能开销
【发布时间】:2014-04-12 11:19:09
【问题描述】:

假设我有一个接口Vehicle 和实现CarCar 类有一个名为getNumberCylinders() 的方法,它不是Vehicle 接口的一部分。因此,在我的代码中,我需要将Vehicle 实例转换为Car 类才能调用此方法。

与将此方法包含在接口中并在不进行强制转换的情况下直接调用该方法的替代方案相比,这种转换是否会产生性能开销?

【问题讨论】:

  • 强制转换在运行时不做任何事情。
  • @DavidWallace 所以投射会有 0 纳秒的性能损失?
  • 如果Vehicle 是一个接口,那么就没有“Vehicle 实例”这样的东西。有一个实现Vehicle 的类的实例。
  • @DavidWallace 所以JVM规范#2.6.8要求的运行时检查没有发生? checkcast 操作码不存在?

标签: java performance interface casting


【解决方案1】:

与将此方法包含在接口中并在不进行强制转换的情况下直接调用该方法的替代方案相比,这种转换是否会产生性能开销?

在这种情况下,是的,因为对象可能不是 Car,所以 Java 必须进行运行时检查,这就是 ClassCastExceptions 可以被抛出的方式。 JVM 规范 #2.6.8。

如果你必须做这种事情,你通常在设计阶段就做错了。我会重新考虑你的对象模型。

【讨论】:

  • 这个例子有点奇怪,但问题是真实的。如果 OP 说“汽车有后备箱方法而摩托车没有”并且它们都是车辆,那将是完全合理的。但是,我相信您对性能开销的看法是正确的,所以我赞成。
【解决方案2】:

如果您认为所有车辆都应该有“气缸数”,那么最好将该方法添加到 Vehicle 接口中。否则,铸造完全没问题。在运行时,强制转换根本不会修改您的对象。铸造更多地与编译检查有关。 尽管 Java 规范本身并不保证它将是 0 纳秒操作,但没有明显的关于强制转换操作导致的性能开销的报告。 在我的应用程序中,我将更多地担心不必要的数据库命中和对象创建,而不仅仅是类型转换。

【讨论】:

    猜你喜欢
    • 2013-01-29
    • 2010-10-27
    • 1970-01-01
    • 2017-02-16
    • 1970-01-01
    • 2019-07-26
    • 2011-04-11
    • 1970-01-01
    • 2021-04-03
    相关资源
    最近更新 更多