Java instanceof怎么可能比多态调用更快?
我在看这个问题的答案Java instanceof怎么可能比多态调用更快?,java,jvm,Java,Jvm,我在看这个问题的答案 instanceof怎么可能比像equals这样的多态调用更快呢 我想,你指的是哪个应该被否决,而不是获得这么多的赞成票。首先,任何没有显示测试中的实际代码或没有命名任何基准测试工具的数字都应该被认为是(也许)有趣的评论,而不是高质量的答案 其次,这个答案比较了两个完全不相关的操作,一个String相等性检查和instanceof操作符。这个答案误导了读者(像你一样)认为它承担了任何关于Java方法调度成本的发现,但是没有办法单独衡量这个成本。如果您度量调用一个执行work
instanceof
怎么可能比像equals
这样的多态调用更快呢 我想,你指的是哪个应该被否决,而不是获得这么多的赞成票。首先,任何没有显示测试中的实际代码或没有命名任何基准测试工具的数字都应该被认为是(也许)有趣的评论,而不是高质量的答案
其次,这个答案比较了两个完全不相关的操作,一个String
相等性检查和instanceof
操作符。这个答案误导了读者(像你一样)认为它承担了任何关于Java方法调度成本的发现,但是没有办法单独衡量这个成本。如果您度量调用一个执行work X的方法的成本(比如字符串比较),那么您基本上度量的是work X的成本(字符串比较),而不是调用成本。由于instanceof
不执行字符串比较,显然它比调用String.equals
做的工作要少。尤其是String.equals(Object)
的实现甚至对参数执行了instanceof
因此,当调用String.equals
时,您应该不会感到惊讶,因为它比执行唯一的instanceof
操作要花费更多的成本,从而给出一个完全不同的问题的答案。相关的答案仍然不足以证明这确实发生了。对于10000000次迭代的循环,测量80±17ms和168±62ms是一个明显的迹象,表明循环体的实际成本深深地埋藏在统计噪声之下
除此之外,
String.equals
甚至不能被视为多态调用。我想,你指的是哪个应该被否决,而不是获得那么多赞成票。首先,任何没有显示测试中的实际代码或没有命名任何基准测试工具的数字都应该被认为是(也许)有趣的评论,而不是高质量的答案
其次,这个答案比较了两个完全不相关的操作,一个String
相等性检查和instanceof
操作符。这个答案误导了读者(像你一样)认为它承担了任何关于Java方法调度成本的发现,但是没有办法单独衡量这个成本。如果您度量调用一个执行work X的方法的成本(比如字符串比较),那么您基本上度量的是work X的成本(字符串比较),而不是调用成本。由于instanceof
不执行字符串比较,显然它比调用String.equals
做的工作要少。尤其是String.equals(Object)
的实现甚至对参数执行了instanceof
因此,当调用String.equals
时,您应该不会感到惊讶,因为它比执行唯一的instanceof
操作要花费更多的成本,从而给出一个完全不同的问题的答案。相关的答案仍然不足以证明这确实发生了。对于10000000次迭代的循环,测量80±17ms和168±62ms是一个明显的迹象,表明循环体的实际成本深深地埋藏在统计噪声之下
除此之外,
String.equals
甚至不能被视为多态调用。你是说包含要点代码和图表的长而详细的答案?在一个拙劣的微基准中,一切都是可能的,答案就是其中的一个实例。你已经在链接中找到了答案,你只是用equals而不是==rest。与链接问题相同,在link@Marko托波尼克:不,那个冗长而详细的回答并不能说明这一点。我想,这个问题是指第二个投票最多(不公平)的问题,它比较了两个完全不相关的操作(字符串相等检查和instanceof
运算符)。@Holger我相信我们都指的是。这是第二个投票最多的,也是唯一一个有图表和要点代码的。但我没有看到字符串相等;我看到.class
与=
相比,一个else if
与instanceof
级联,一个开关与type
级联。它在很多方面都坏了。@Marko Topolnik:看来,我再也不能数到三了。不,我假设,这个问题指的是将instanceof
与String.equals
进行比较的方法。另一个答案也可能被认为是关于其基准方法的问题,等等。,但是,这比将的instanceof
与字符串进行比较更有意义。equals
…你是说用要点代码和图表给出的长而详细的答案?在一个拙劣的微基准中,一切都是可能的,答案就是其中的一个实例。你已经在链接中找到了答案,你只是用equals而不是==rest。与链接问题相同,在link@Marko托波尼克:不,那个冗长而详细的回答并不能说明这一点。我想,这个问题是指第二个投票最多(不公平)的问题,它比较了两个完全不相关的操作(字符串相等检查和instanceof
运算符)。@Holger我相信我们都指的是。这是第二个投票最多的,也是唯一一个有图表和要点代码的。但我没有看到字符串相等;我看到.class
与=
相比,一个else if
与instanceof
级联,一个开关与type
级联。它在很多方面都坏了。@Marko Topolnik:看来,我再也不能数到三了。不,我假设,这个问题指的是将instanceof
与String.equals进行比较的问题。另一个答案也可以被认为是