我需要确定InetSocketAddress
是有效的IPv6还是IPv4。我能看到的唯一两种方法是使用 instanceof
运算符,或检查getAddress()
的长度(应该返回byte[]
)。这两个都不太理想(instanceof
很慢,而getAddress
必须复制数组)。
有更好的选择吗?
答案 0 :(得分:4)
我认为你找不到比instanceof
更快的东西。在这种特殊情况下,我希望JIT编译器优化它以加载和比较一对指针;即大约5台机器指令。
但即使instanceof
明显慢于我理解的速度,它也不太可能对您的应用程序的整体性能产生重大影响。
我建议您只使用instanceof
,如果您此时有确凿证据,则只需要优化它;例如在实际工作量上分析您的应用程序的证据。
答案 1 :(得分:4)
更快的解决方案是比较类型。 Inet4Address和Inet6Address类型是final,因此它们不能被子类化。
Inet4Address.class == IPtoCheck.getClass();
Inet6Address.class == IPtoCheck.getClass();
测试显示,这是instanceof的两倍多,并且不受所比较类型的影响,而Inet4和Inet6地址上instanceof的性能则不同。
答案 2 :(得分:1)
如果您不喜欢instanceof
,可以尝试:
Inet4Address.class.isAssignableFrom(IPtoCheck);
Inet6Address.class.isAssignableFrom(IPtoCheck);
我认为没有比instanceof
或更高版本更快的解决方案。
答案 3 :(得分:1)
与使用其隐式DNS开销构建InetAddress本身的开销相比,instanceof
中的任何开销都是微不足道的。