файл и форматирование альтернативных библиотек для c - PullRequest
0 голосов
/ 03 февраля 2012

Я провел некоторый поиск и не нашел ничего, что улучшило бы функции файлов и форматирования в Visual Studio VS2010 C (не C ++).Мне удалось в некоторой степени решить необработанные проблемы ввода-вывода, используя большие буферы и SSD-накопитель, поэтому более насущной проблемой является замена семейства функций printf.Кто-нибудь нашел что-то стоящее?

Насколько я понимаю, часть ледяной скорости, связанной с функциями printf, заключается в том, что они должны обрабатывать множество типов аргументов.Кто-нибудь имеет опыт написания специфической для типа данных версии printf;например, тот, который печатает только целые, или печатает только двойные и т. д.?

Ответы [ 2 ]

1 голос
/ 03 февраля 2012

Прежде всего, вы должны сначала профилировать код, прежде чем предположить, что он printf.

Но если вы уверены, что он printf и похожий, то вы можете сделать несколько вещей, чтобы решить проблему.* 1) меньше печатать.IE, не вызывайте дорогостоящие операции, если вы можете избежать этого.Вам нужно все вывод, например?

2) вручную заменить конкатенацию строк на встроенные вручную подпрограммы, которые выполняют все части без разбора спецификатора формата.1010 *

Может стать:

 write(1, "--", 2);
 write(1, "really cool", 11);
 write(1, "--", 2);

Что может быть быстрее.Но опять же, вы не узнаете, пока не профилируете это.Не тратьте энергию на решение, пока не подтвердите, что оно вам нужно, и сможете измерить успех предложенного решения.

0 голосов
/ 04 февраля 2012

@ Уэс прав, никогда не думай, что знаешь, что нужно исправить, пока не получишь доказательстваВ чем я отличаюсь - это метод выяснения.Я и другие используем случайная пауза , которая работает для по этим причинам и здесь короткая демонстрация слайдов и код на C ++, чтобы вы могли видеть, как это работает, если хотите.

Особенность функции printf (или любого выходного) в том, что она тратит A) определенное количество циклов ЦП, создавая буфервыводится, а затем тратит B) определенное количество времени на ожидание, пока система и / или вспомогательное оборудование на самом деле перемещает данные.

Это может быть немного упрощено, но если вы случайно остановите иисследуй состояние, вот что ты видишь.То, что вы сделали, используя большие буферы и SSD-накопитель, это уменьшение B, и это хорошо.Это означает, что оставшееся время, A больше.Вы знаете это.

Теперь из примеров, которые вы найдете в A, вы можете получить подсказку о том, что происходит, если увидите, какие подчиненные процедуры внутри printf обнаруживаются.Обычно printf вызывает что-то вроде vprintf, чтобы избавиться от списка аргументов переменной, который затем циклически перебирает строку формата, чтобы выяснить, что делать, включая такие вещи, как синтаксический анализ спецификаторов точности. Если похоже, что это то, что он делает, тогда вы знаете, сколько времени уходит на разбор формата. С другой стороны, , если вы видите это внутри подпрограммы, которая копирует строку или форматирует целое число (наряду с обработкой начальных / конечных символов и т. Д.), То вы знаете, что на этом нужно сконцентрироваться. С другой стороны, , если вы видите это внутри подпрограммы, которая выглядит так, как будто она форматирует число с плавающей запятой (что на самом деле довольно сложно), вы знаете, что нужно сконцентрироваться на этом.

Учитывая всечто, ты хочешь знать, что я делаю?Во-первых, я спрашиваю, кто это все равно будет читать?Если никому не нужно читать весь этот текст, почему бы не выкачать его в двоичном виде?Или в шестнадцатеричном виде?Если вы просто пишете двоичный файл, A сжимается до нуля, а когда вы читаете его обратно с другой программой, угадайте что? Нет потерянных битов!

...