gpt4 book ai didi

valueOf() 的 Java boolean 实现

转载 作者:行者123 更新时间:2023-12-01 22:31:49 25 4
gpt4 key购买 nike

在浏览 JDK 1.7 源代码时,我注意到 Boolean.java 中的这些方法:

public static Boolean valueOf(String s) {
return toBoolean(s) ? TRUE : FALSE;
}

private static boolean toBoolean(String name) {
return ((name != null) && name.equalsIgnoreCase("true"));
}

所以 valueOf() 在内部调用 toBoolean(),这很好。我确实发现阅读 toBoolean() 方法的实现方式很有趣,即:

  1. equalsIgnoreCase() 与我通常所做的相反(先放置字符串),然后
  2. 首先进行空检查。如果采用第 1 点,这似乎是多余的;因为该方法中的第一次/第二次检查是空检查。

所以我想我应该进行一个快速测试,并检查我的实现与 JDK 相比如何工作。这是:

public class BooleanTest {
private final String[] booleans = {"false", "true", "null"};

@Test
public void testJdkToBoolean() {

long start = System.currentTimeMillis();

for (int i = 0; i < 1000000; i++) {
for (String aBoolean : booleans) {
Boolean someBoolean = Boolean.valueOf(aBoolean);
}
}

long end = System.currentTimeMillis();

System.out.println("JDK Boolean Runtime is: " + (end-start));
}

@Test
public void testModifiedToBoolean() {
long start = System.currentTimeMillis();

for (int i = 0; i < 1000000; i++) {
for (String aBoolean : booleans) {
Boolean someBoolean = ModifiedBoolean.valueOf(aBoolean);
}
}

long end = System.currentTimeMillis();

System.out.println("ModifiedBoolean Runtime is: " + (end-start));
}
}

class ModifiedBoolean {
public static Boolean valueOf(String s) {
return toBoolean(s) ? Boolean.TRUE : Boolean.FALSE;
}

private static boolean toBoolean(String name) {
return "true".equalsIgnoreCase(name);
}
}

结果如下:

Running com.app.BooleanTest
JDK Boolean Runtime is: 37
ModifiedBoolean Runtime is: 34
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.128 sec

所以 yield 不大,尤其是在分布超过 100 万次运行时。确实没有那么令人惊讶。

我想了解的是它们在字节码级别上有何不同。我有兴趣深入研究这个领域,但没有任何经验。这样的工作是否值得?它会提供有用的学习体验吗?这是人们经常做的事情吗?

最佳答案

由于以下几个原因,性能不会提高:

  1. 检查 name == null 是否是一个昂贵的操作。
  2. 需要时间的事情是加载 name 的值...无论哪种情况都必须加载。
  3. name==null 比调用 String.equalsIgnoreCase 更快,因为它是一个简单的相等测试而不是函数调用。
  4. 这些并不重要,因为架构可能会使用预测分支,因此如果您的大多数调用不是针对 null 字符串,架构将开始加载分支指令,就像您的字符串一样不null

关于valueOf() 的 Java boolean 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27612588/

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