代码之家  ›  专栏  ›  技术社区  ›  fastcodejava

哪个是类的obj实例或obj.booleananyMethod()更快

  •  1
  • fastcodejava  · 技术社区  · 14 年前

    我在一次采访中被问到这个问题。不计算执行方法体所需的时间。 有什么想法吗?

    4 回复  |  直到 14 年前
        1
  •  6
  •   erickson    14 年前

    我想通过分析来量化差异,但我想 instanceof 更快。

    想想看… booleanReturnMethod() 是一个实例方法(如果它是静态的,那么您就已经知道该类了),所以方法调度的第一步是确定它是哪个对象类。这就像一个 运算符 就在那里。

    但是必须找到实际的方法体,并且必须设置调用。即使您不考虑方法体本身,这种准备也需要一些额外的时间。

        2
  •  8
  •   Dean Harding    14 年前

    我对这个问题的回答是“我不在乎”。如果我写的申请有问题,我怀疑 instanceof 为了找到原因,我会分析一下 原因,但我不会仅仅凭直觉就重写大块代码。

        3
  •  2
  •   L. Cornelius Dol    14 年前

    首先,我猜想方法调用,但只是一根头发,因为确定类实例关系实际上相当复杂,不仅涉及完整的类名,还涉及加载它的类加载器。

    其次,在目标硬件和JVM上测量并查看,然后准备好让结果随着下一个JVM版本的变化而变化。

    第三,谁才是最关心的人,除非你要设计一个从根本上依赖于以非常高的速度检查实例的体系结构。在任何一个合理复杂的系统中,这都不是一个因素…但那只是我的2美分,我通常很倾向于考虑特定编码风格的性能。

    第四,方法调用样式通常比检查类型更好,但是必须在上下文中查看系统才能确保这是正确的。

        4
  •  1
  •   Mateusz Dymczyk    14 年前

    我不太明白这个问题…所以面试你的那个人想看看你是否知道一个关键字实例是否比调用一个随机方法更快?首先,我会说,因为它是一个关键字,所以我认为与您声明的方法相比,JVM对它的问题更少。但我会说,我不太在乎,因为我不太喜欢依赖instanceof,我只在被迫的时候才使用它。我的意思是,如果我必须编写一段代码,在这种代码中我依赖“if t instanceof z else…”之类的东西,那么我真的需要一两分钟来思考我是否做错了什么。