如果需要检查字母是否为大写,可以在Java中使用Character.isUpperCase(char c),这非常简单明了。
如果它在[65,90]范围内,也可以检查unicode值。
我确定它几乎无足轻重,但就像switch语句比if语句运行得更快,使用unicode检查会比方法调用更快吗?
答案 0 :(得分:2)
首先,你没有比较喜欢。
Character.isUpperCase(char)
方法测试一个字符是否是任何Unicode大写字符。 if
测试如下:
if (ch >= 65 && ch <= 90)
只测试字符是否为(7位)ASCII大写字符。后者可能更快,因为它是一个更简单的测试。但也可能是错误的测试。
引擎盖下,isUpperCase
代码很复杂,因为它必须适用于所有Unicode代码平面,并且能够有效地处理常见情况(LATIN-1字符)。它正在做一些相当聪明的事情来实现这一点,但在某些情况下它确实使用了switch
。
我确定它几乎无足轻重,但就像switch语句比if语句运行得更快,使用unicode检查会比方法调用更快吗?
在完整申请的背景下,它可能是微不足道的。标准建议是在您尝试优化此级别的代码之前,>>
但是为了回答你的问题,Java中的switch
语句将由JIT编译器编译为branch table或一系列if ... else if ...
测试。决定使用哪种方法是速度与代码空间的权衡,它取决于开关臂的数量和稀疏程度。我不知道这一点,但怀疑JIT编译器是否在另一个方向进行优化;即从if ... else if ...
测试序列的字节码到分支表。
UPDATE :实际上,字节码指令集提供了两种编码switch语句的方法(对于整数目标);见JVM spec 3.10。另见Difference between JVM's LookupSwitch and TableSwitch?。所以,实际上,一些决策可能发生在字节码编译器而不是JIT编译器中。
更新2 :然而,我在John Rose的邮件列表中找到了这个。
C2 JIT使用自己的高效概念从头开始重新组织lookupswitch和tableswitch指令。你最终会得到一个决策树和/或一些PC跳转块,但你最终可能会混合使用这两个指令。
C1 JIT还重新组织指令,检测关键范围(常见分支目标的运行)并通过每个范围1-2次比较来处理它们。奇怪的是,它并不打算在此基础上放置决策树,也不会尝试跳转表。
来源:http://compiler-dev.openjdk.java.narkive.com/dg9XUG39/compiling-large-switch-statements
无论如何,为了给JIT编译器提供实现最快代码的最佳机会,最好使用switch
语句。当然,如果您使用switch
。
但重申一下,将简单if
测试与isUpperCase
之类的复杂事物进行比较并不是一个公平(或特别有意义)的比较。我希望期待 if
版本更快,因为它做得更简单。