Grz*_*icz 6 string format performance android listview
我正在使用自定义绘制视图实现ListView活动,并具有以下代码:
@Override
public void onDraw(Canvas canvas)
{
super.onDraw(canvas);
....
canvas.drawText(String.format("%02d: %dx%d", position, w, h),
10, 15, cached_paint);
}
Run Code Online (Sandbox Code Playgroud)
在onDraw方法中几乎没有别的东西,所以这让我很生气,为什么滚动如此糟糕.我偶然把drawText参数更改为不使用String.format,然后突然滚动了黄油丝.事实上,以下几乎是相同但表现良好:
canvas.drawText("" + position + ": " + w + "x" + h,
10, 15, cached_paint);
Run Code Online (Sandbox Code Playgroud)
我惊呆了.为什么后者比调用String.format更快?我希望对象连接产生更多的中间对象和一般的垃圾性能,但我发现完全相反.事实上,当使用String.format运行时,我从vm获得了大量的分配/释放消息.
那么为什么String.format显然可以更快(至少来自其他编程语言,其中对象创建是昂贵的)时,它是如此之慢?
字符串连接+不会产生很多中间对象; 基本上是一个StringBuffer及其内部字符数组(如果容量不足,可能会重新分配).哦,和通过连接时的字符串.
此外,+分析进入字符串的对象的数据类型的大部分工作是在编译时完成的.使用String.format,这是在运行时完成的.最重要的是,传递给String.format的每个基本类型都需要自动生成,这会产生更多的对象.