在我的应用程序obj.getClass().isArray()
中非常频繁地调用并成为应用程序的瓶颈.
如果对象是数组,我想在运行时有效地检查.原始数组和对象数组应返回true.
我可以想象的方式是instanceof
所有原始数组,但不能处理类似int [] []的类型.该应用程序用作lib,因此我无法列出所有类型.
那有什么线索吗?
我刚刚完成的基准测试给出了以下结果:
{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)
结果顺序仍然相同.
isArray()
是在运行时检查对象是否是数组实例的最有效方法.如果性能有问题,您可以使用以下方法之一来解决它:
isArray()
在编译时已知结果.isArray()
操作期间的值,因此只需要调用一次.