检查字母是否大写的更快方式(性能)?

时间:2016-10-24 00:53:18

标签: java performance methods unicode char

如果需要检查字母是否为大写,可以在Java中使用Character.isUpperCase(char c),这非常简单明了。

如果它在[65,90]范围内,也可以检查unicode值。

我确定它几乎无足轻重,但就像switch语句比if语句运行得更快,使用unicode检查会比方法调用更快吗?

1 个答案:

答案 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版本更快,因为它做得更简单。