【发布时间】:2020-12-18 04:38:00
【问题描述】:
在Java中,代码如下:
long x = 123;
String s = "abc" + x;
运行时间明显长于:
long x = 123;
String s = "abc" + String.valueOf(x);
我是通过 leetcode 了解到的。我试图解决以下问题:https://leetcode.com/problems/fraction-to-recurring-decimal/
这是我的解决方案的确切代码:
public String fractionToDecimal(int numerator, int denominator) {
long n = numerator, d = denominator;
boolean isNegative = (n * d < 0);
if(n < 0) n = -n;
if(d < 0) d = -d;
long q = n / d;
long r = n % d;
if(r == 0) return (isNegative ? "-" : "") + q;
StringBuilder sb = new StringBuilder();
if(isNegative) sb.append('-');
sb.append(q).append('.');
Map<Long, Integer> found = new HashMap<>();
int index = sb.length();
while(r > 0 && !found.containsKey(r)){
found.put(r, index++);
n = r * 10;
q = n / d;
r = n % d;
sb.append(q);
}
if(r > 0) {
sb.insert(found.get(r), "(");
sb.append(')');
}
return sb.toString();
}
当我点击 Submit 时,需要 7 毫秒 才能完成。
但如果我真的只是改变行号。 8 从+ q 到+ String.valueOf(q) 运行时间下降到仅1 毫秒。如有必要,请随意将代码复制粘贴到 leetcode 上进行尝试,并在运行时亲自查看此更改。
这让我非常困惑。为什么会这样?据我了解,在这两种情况下,编译器首先将 long 转换为字符串,然后将这两个字符串连接在一起,对吗?那么,在幕后,连接一个 String 和一个 long 与连接两个 String 完全一样吗?那么为什么一个比另一个需要更多的时间来运行呢?任何见解将不胜感激。 TIA。
【问题讨论】:
-
你的微基准测试结果在哪里证明你的断言?
-
您如何得出明显不同的时间安排的结论?你是如何测量的,你的数字是多少?你知道,在 Java 中进行正确的基准测试是很困难的......
-
@f1sh:我会在一纳秒内下注。第一个在执行时不涉及任何连接,第二个是。
-
您现在已经对问题进行了重大更改,因此我的回答没有任何意义。请不要那样做。
-
我也无法在 Leetcode 上重现你的结果。您的解决方案对我来说始终显示为 0ms。我刚刚尝试引入一个循环,因此它实际上会在返回结果之前评估结果 100,000 次...此时它需要 25-50 毫秒(不一致,并且仍然不足以作为基准测试)但它仍然 没有显示您所描述的行为。
标签: java concatenation string-concatenation