我正在使用自定义绘制的 View 实现一个 ListView Activity ,并具有以下代码:
@Override
public void onDraw(Canvas canvas)
{
super.onDraw(canvas);
....
canvas.drawText(String.format("%02d: %dx%d", position, w, h),
10, 15, cached_paint);
}
onDraw 方法中几乎没有其他内容,所以这让我抓狂,为什么滚动如此糟糕。一次偶然的机会,我将 drawText 参数更改为不使用 String.format,突然滚动又变成了黄油丝。事实上,以下内容几乎相同但表现良好:
canvas.drawText("" + position + ": " + w + "x" + h,
10, 15, cached_paint);
我惊呆了。为什么后者比调用 String.format 更快?我希望对象连接会生成更多的中间对象和一般垃圾性能,但我发现恰恰相反。事实上,当我使用 String.format 运行时,我从虚拟机中获得了很多分配/解除分配消息。
那么,为什么 String.format 明明可以更快(至少当来自对象创建成本高昂的其他编程语言时)却这么慢?
最佳答案
使用 +
的字符串连接不会生成很多中间对象;基本上是一个 StringBuffer 及其内部字符数组(如果容量用完可能会重新分配)。哦,还有字符串,当它通过连接时。
此外,使用+
,分析进入字符串的对象的数据类型的大部分工作都在编译时完成。使用 String.format,这是在运行时完成的。最重要的是,您传递给 String.format 的每个原始类型都需要自动装箱,这确实会生成更多对象。
关于android - 为什么android的String.format狗慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6311599/