Object.isArray()很慢,有没有快速的方法呢?

Nic*_*las 19 java performance

在我的应用程序obj.getClass().isArray()中非常频繁地调用并成为应用程序的瓶颈.
如果对象是数组,我想在运行时有效地检查.原始数组和对象数组应返回true.
我可以想象的方式是instanceof所有原始数组,但不能处理类似int [] []的类型.该应用程序用作lib,因此我无法列出所有类型.
那有什么线索吗?

sp0*_*00m 8

我刚刚完成的基准测试给出了以下结果:

{s instanceof Object[]} spends 44ms
{s.getClass().getName().charAt(0) == '['} spends 58ms
{s.getClass().isArray()} spends 303ms
Run Code Online (Sandbox Code Playgroud)

Benchmark已经使用Benchmark.java完成,使用Main.java调用.


在讨论了final上述基准测试中变量的使用后,请使用本地测试结果查看新结果:

{s instanceof Object[]} spends 83ms
{s.getClass().getName().charAt(0) == '['} spends 93ms
{s.getClass().isArray()} spends 354ms
Run Code Online (Sandbox Code Playgroud)

即使持续时间都有点长(有趣的顺便说一下),它们的顺序也得到了保留.

然后使用这个新的Main.java调用Benchmark.java .


并使用与其他Main.java调用的原始数组:

{a instanceof int[]} spends 71ms
{a.getClass().getName().charAt(0) == '['} spends 82ms
{a.getClass().isArray()} spends 340ms
Run Code Online (Sandbox Code Playgroud)

结果顺序仍然相同.

  • @ sp00m查看类名的第一个字符是一个聪明的尝试.我喜欢! (3认同)

Sam*_*ell 7

isArray()是在运行时检查对象是否是数组实例的最有效方法.如果性能有问题,您可以使用以下方法之一来解决它:

  • 重构代码,以便单独处理数组对象和非数组对象,因此isArray()在编译时已知结果.
  • 使用局部变量和/或参数来缓存isArray()操作期间的值,因此只需要调用一次.

  • 我同意重构,但任何人都可以回复他们声称'isArray()`比`instanceof`慢得多吗?我认为缓存结果可能比解决问题更有害! (2认同)