Почему Android String.format работает медленно?

Я реализовал действие ListView с настраиваемыми рисованными представлениями и имел следующий код:

@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 такой медленный, хотя очевидно, что он мог бы быть быстрее (по крайней мере, если исходить из других языков программирования, где создание объектов стоит дорого)?

6
задан Grzegorz Adam Hankiewicz 10 June 2011 в 20:13
поделиться