gpt4 book ai didi

java - 字符串到 int 或 int 到字符串 : which is faster?

转载 作者:搜寻专家 更新时间:2023-11-01 02:42:29 26 4
gpt4 key购买 nike

我需要比较一个字符串(它是一个有效的整数)和一个 int 值。

对于String strint integer,我的选择是:

  1. Integer.parseInt(str) == integer

  2. str.equals(Integer.toString(integer))

哪个更快,有没有更好的方法?

以下灵感来自atlaste的回答EqualsIntString

 private static boolean checkEquality(final String string, final long value) {

if (string == null) {
return false;
}
final int length = string.length();
if (length == 0) {
return false;
}

long absValue;
final byte minIndex;
if (string.charAt(0) == '-') {
if (value > 0) {
return false;
}
absValue = -value;
minIndex = 1;
} else {
if (value < 0) {
return false;
}
absValue = value;
if (string.charAt(0) == '+') {
minIndex = 1;
} else {
minIndex = 0;
}
}

for (int idx = length - 1; idx >= minIndex; idx--) {
final byte rem = (byte) (absValue % 10);
absValue /= 10;
final int diff = string.charAt(idx) - rem - 48;
if (diff != 0) {
return false;
}
}

return absValue == 0;
}

最佳答案

只有一种方法可以知道:测量。

快速的 JMH 基准测试显示 Integer.parseInt 更快,无论整数的大小如何。但我们谈论的是 10 纳秒左右,它不太可能对您的应用程序级别产生太大影响。

如果您100%确定您的字符串是一个有效的整数,您也可以手动解析它,这样会更快(参见parseManual 和下面代码中的 equalsIntString 方法)。使用哪种方法还取决于您是否期望值经常相等或经常不同(如果它们经常相等,parseManual 效果更好,如果您期望它们平均不同, equalsIntString 更快)。

因此,数据集的特征在决策中也很重要。

完整结果(分数以每次操作的纳秒为单位:越小越好)- (n) 列是正在比较的整数。第一部分比较等值,第二部分比较不等值。

Benchmark                                       (n)  Mode  Samples   Score   Error  Units
c.a.p.SO30507506.manual 1 avgt 10 6.579 ± 0.131 ns/op
c.a.p.SO30507506.manual 12345 avgt 10 10.017 ± 0.401 ns/op
c.a.p.SO30507506.manual 123456789 avgt 10 12.490 ± 0.243 ns/op
c.a.p.SO30507506.manualAtlaste 1 avgt 10 7.914 ± 0.144 ns/op
c.a.p.SO30507506.manualAtlaste 12345 avgt 10 15.902 ± 0.593 ns/op
c.a.p.SO30507506.manualAtlaste 123456789 avgt 10 28.117 ± 0.463 ns/op
c.a.p.SO30507506.parse 1 avgt 10 8.495 ± 0.325 ns/op
c.a.p.SO30507506.parse 12345 avgt 10 21.614 ± 0.564 ns/op
c.a.p.SO30507506.parse 123456789 avgt 10 34.692 ± 0.572 ns/op
c.a.p.SO30507506.stringEquals 1 avgt 10 21.597 ± 0.594 ns/op
c.a.p.SO30507506.stringEquals 12345 avgt 10 36.948 ± 1.144 ns/op
c.a.p.SO30507506.stringEquals 123456789 avgt 10 44.444 ± 1.011 ns/op

c.a.p.SO30507506.manual_unequal 1 avgt 10 7.011 ± 0.149 ns/op
c.a.p.SO30507506.manual_unequal 12345 avgt 10 10.244 ± 0.350 ns/op
c.a.p.SO30507506.manual_unequal 123456789 avgt 10 13.135 ± 0.797 ns/op
c.a.p.SO30507506.manualAtlaste_unequal 1 avgt 10 4.328 ± 0.111 ns/op
c.a.p.SO30507506.manualAtlaste_unequal 12345 avgt 10 4.359 ± 0.115 ns/op
c.a.p.SO30507506.manualAtlaste_unequal 123456789 avgt 10 4.339 ± 0.103 ns/op
c.a.p.SO30507506.parse_unequal 1 avgt 10 8.304 ± 0.251 ns/op
c.a.p.SO30507506.parse_unequal 12345 avgt 10 21.514 ± 0.405 ns/op
c.a.p.SO30507506.parse_unequal 123456789 avgt 10 35.257 ± 1.043 ns/op
c.a.p.SO30507506.stringEquals_unequal 1 avgt 10 19.060 ± 0.162 ns/op
c.a.p.SO30507506.stringEquals_unequal 12345 avgt 10 31.829 ± 0.427 ns/op
c.a.p.SO30507506.stringEquals_unequal 123456789 avgt 10 41.870 ± 0.252 ns/op

代码:

@State(Scope.Benchmark)
@BenchmarkMode(Mode.AverageTime)
public class SO30507506 {

@Param({"1", "12345", "123456789"}) int n;
int i;
String s;

@Setup public void setup() {
i = n;
s = String.valueOf(n);
}

@Benchmark public boolean parse() {
return Integer.parseInt(s) == i;
}

@Benchmark public boolean stringEquals() {
return s.equals(Integer.toString(i));
}

@Benchmark public boolean manual() {
return parseManual(s) == i;
}

@Benchmark public boolean manualAtlaste() {
return equalsIntString(i, s);
}

@Benchmark public boolean parse_unequal() {
return Integer.parseInt(s) == i * 2;
}

@Benchmark public boolean stringEquals_unequal() {
return s.equals(Integer.toString(i * 2));
}

@Benchmark public boolean manual_unequal() {
return parseManual(s) == i * 2;
}

@Benchmark public boolean manualAtlaste_unequal() {
return equalsIntString(i * 2, s);
}

private static int parseManual(String s) {
int result = 0;
int sign = s.charAt(0) == '-' ? -1 : 1;
int startIndex = (s.charAt(0) >= '0' && s.charAt(0) <= '9') ? 0 : 1;
for (int i = startIndex; i < s.length(); i++) {
result *= 10;
result += s.charAt(i) - '0';
}
return result * sign;
}

private static boolean equalsIntString(int value, String s) {
if (s.isEmpty()) return false; // This is never good.
if ((s.charAt(0) == '-' && value >= 0) || (s.charAt(0) != '-' && value < 0)) return false; // positive/negative check

// Define the limit. This is basically the end of the string to check.
int limit = 0;
if (value < 0) {
limit = 1;
value = -value;
}

for (int i = s.length() - 1; i >= limit; --i) {
char expected = (char) ('0' + (value % 10)); // the modulo will be optimized by the JIT because 10 is a constant
value /= 10; // same story.

if (s.charAt(i) != expected) return false;
}
return true;
}
}

关于java - 字符串到 int 或 int 到字符串 : which is faster?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30507506/

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