Я столкнулся с данной проблемой и исключительно 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 на оптимизированные.
Оптимизированные выглядят страшно:
До:
real 2m12.445s
user 0m58.696s
sys 0m33.264s
После:
real 1m25.934s
user 0m33.288s
sys 0m26.848s
Ставим плюсики на репозитории qrintf и благодарим его автора :)
Что же, это почти удалось.
Во-первых, я бы рекомендовал прочесть данный пост на тему ущербности дизайна 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;Но этот подход дает реальное ускорение кода где-то на 65%.
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;
До:
real 2m12.445s
user 0m58.696s
sys 0m33.264s
После:
real 1m25.934s
user 0m33.288s
sys 0m26.848s
Ставим плюсики на репозитории qrintf и благодарим его автора :)
Я столкнулся с адскими тормозами в своей железке, там у меня был макрос trace(__FILE__, __LINE__...) кот. работал ч.з fprintf. И да, консоль была на СОМ порту с 19200 (который к тому же никуда не был подключен ;)
ReplyDeleteСурово :) Да, логи частые "юзеры" sprintf и прочих.
Delete