Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java instanceof怎么可能比多态调用更快?_Java_Jvm - Fatal编程技术网

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进行比较的问题。另一个答案也可以被认为是