android - 为什么android的String.format狗慢?

标签 android performance string listview format

我正在使用自定义绘制的 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/

相关文章:

java - 两个 AVL 树的替代方案

string - 将字符串拆分为最少数量的字符串,其中每个字母重复奇数次

Android:如何将单选按钮设置为 'grey out'

android - 以编程方式创建多行 EditText

android - Android-并获得权限WRITE_SETTINGS ?!

python - 如何向文件中的每一行添加一个字符串?

c - C中给char ***分配内存

android - 创建和加载 "savedInstanceState"时,为什么需要使用常量作为键?

c - 为什么添加线程会使这个简单的套接字服务器更快?

javascript - Mobx 性能