FastNetMon

вторник, 2 февраля 2016 г.

Что делать, если perf top забит вызовами vfprintf и у вас есть исходники провинившейся программы?

Я столкнулся с данной проблемой и исключительно just for fun попытался ее решать не внося правок в код.

Что же, это почти удалось.

Во-первых, я бы рекомендовал прочесть данный пост на тему ущербности дизайна sprintf/snprintf-like функций: http://blog.kazuhooku.com/2014/10/announcing-qrintf-and-qrintf-gcc.html

Решение очень простое, использовать препроцессор кода qrintf (https://github.com/h2o/qrintf) и заменить вызов gcc на вызов qrintf,  который в свою очередь автоматически заменит все вызовы snprintf на оптимизированные.

Оптимизированные выглядят страшно:
     as = (comval >> 16) & 0xFFFF;
      val = comval & 0xFFFF;
      _qrintf_chk_finalize (_qrintf_chk_d(_qrintf_chk_c(_qrintf_chk_d(_qrintf_chk_c(_qrintf_chk_init(buf + strlen (buf), BUFSIZ - strlen (buf))
            , ' '), as), ':'), val));
      break;
Но этот подход дает реальное ускорение кода где-то на 65%.

До:
real 2m12.445s
user 0m58.696s
sys 0m33.264s

После:
real 1m25.934s
user 0m33.288s
sys 0m26.848s

Ставим плюсики на репозитории qrintf и благодарим его автора :)

2 комментария :

  1. Я столкнулся с адскими тормозами в своей железке, там у меня был макрос trace(__FILE__, __LINE__...) кот. работал ч.з fprintf. И да, консоль была на СОМ порту с 19200 (который к тому же никуда не был подключен ;)

    ОтветитьУдалить
    Ответы
    1. Сурово :) Да, логи частые "юзеры" sprintf и прочих.

      Удалить

Примечание. Отправлять комментарии могут только участники этого блога.