gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 03:16:32 26 4
gpt4 key购买 nike

如果你需要检查一个字母是否是大写,你可以在Java中使用Character.isUpperCase(char c),这非常直接和简单。

您还可以检查 unicode 值是否在 [65, 90] 范围内。

我确信它几乎微不足道,但就像 switch 语句比 if 语句运行得更快一样,使用 unicode 检查会比方法调用更快吗?

最佳答案

首先,你不是在比较同类。

Character.isUpperCase(char) 方法测试字符是否为任何 Unicode 大写字符。 if 测试如下:

   if (ch >= 65 && ch <= 90) 

仅测试该字符是否为(7 位)ASCII 大写字符。后者可能更快,因为它是一个更简单的测试。但这也可能是错误的测试。

在底层,isUpperCase 代码很复杂,因为它必须适用于所有 Unicode 代码平面,并能有效地处理常见情况(LATIN-1 字符)。它正在做一些相当聪明的事情来实现这一点,但在某些情况下它确实使用switch

<小时/>

I'm sure its almost insignificant, but just like how switch statements will run quicker than if statements, would using the unicode check be quicker than the method call?

在完整的应用程序中,这可能是微不足道的。标准建议是在尝试在此级别优化代码之前,对您的实际应用程序进行基准测试和分析。

但是为了回答你的问题,Java 中的 switch 语句将由 JIT 编译器编译为 branch table或一系列 if ... else if ... 测试。使用哪个的决定是速度与代码空间的权衡,并且取决于开关臂的数量和稀疏性。我不知道这一点,但怀疑 JIT 编译器是否在另一个方向上进行了优化;即从一系列 if ... else if ... 测试分支表的字节码。

更新:事实上,字节码指令集提供了两种编码 switch 语句的方法(对于整数目标);请参阅JVM spec 3.10 。另请参阅Difference between JVM's LookupSwitch and TableSwitch? 。因此,事实上,某些决策可能是在字节码编译器而不是 JIT 编译器中进行的。

更新 2:但是,我随后在 John Rose 的邮件列表中找到了此内容。

The C2 JIT reorganizes lookupswitch and tableswitch instructions from scratch, using its own notions of what is efficient. You end up with a decision tree and/or some PC jump blocks, but you can end up with a mix of both from either instruction.

The C1 JIT reorganizes the instructions also, detecting key ranges (runs of common branch targets) and handling them with 1-2 comparisons per range. Oddly, it does not bother to put a decision tree on top of this, nor does it attempt jump tables.

来源:http://compiler-dev.openjdk.java.narkive.com/dg9XUG39/compiling-large-switch-statements

无论如何,为了让 JIT 编译器有最好的机会实现最快的代码,最好使用 switch 语句。当然,如果您使用switch,代码的意图会更清晰。

但重申一下,将简单的 if 测试与像 isUpperCase 这样复杂的测试进行比较并不是一个公平(或特别有意义)的比较。我期望 if 版本会更快,因为它做的事情要简单得多。

关于java - 检查字母是否大写的更快方法(性能)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40209348/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com