2015-01-14 3 views
-4

Я начинаю программист и я читал, что printf() очень изощренно функционирует очень медленно и потребляет много циклов процессора. Поэтому я хочу знать, есть ли какая-либо функция, которая существует в стандартной чистой библиотеке c и быстрее, чем printf() или нет, и когда использовать эту функцию и когда ее не использовать. Моя цель состоит в том, чтобы написать эффективный код, который может работать на любом компьютере и/или встроенной системыфункция, которая быстрее, чем printf

+1

Это зависит от того, какой будет выход. 'printf' форматирует вывод, вы тоже хотите отформатировать вывод? –

+3

Вы измеряли, что 'printf' медленный, или вы просто разбираете вещи, услышанные из других мест? Не пытайтесь оптимизировать, пока у вас нет возможности оптимизировать. – cnicutar

+9

Если вы новичок, не беспокойтесь о производительности. действительно, это неправильный разум. –

ответ

3

на самом деле я обнаружил, что write() является самой быстрой альтернативой printf() я написал 2 маленьких программ, которые печатает привет мир на стандартное первый один

#include <stdio.h> 
#include <string.h> 
#include <unistd.h> int main() { 
char* h = "hello world\n"; 
for (int i=0; i < 100000; i++) write(0,h,strlen(h)); 
} 

и второй один

#include <stdio.h> 
int main() { 
char* x = "hello world\n"; 
for (int i =0;i<100000; i++) printf("%s",x); } 

и сравнили время работы 2-х программ на моем компьютере компьютер , первая из которых завершена в 2.740s , а вторая прекращена в 3.071s

+3

Если вам нужна производительность, не называйте 'write',' fwrite' намного лучше. 'write' - это системный вызов вызова, который является mucbh более дорогостоящим, чем вызов библиотечной функции, такой как' fwrite'. Позднее вы предоставите вам буферизацию, которая экономит вам несколько дорогостоящих «писем». –

1

Есть причины, которые препятствуют использованию printf.

1) printf является функцией и вряд ли может быть встроенным, так как функция нарушает оптимизацию компилятора кода вокруг него. Если у вас есть цикл, который делает много тяжелой работы, и вы хотите, чтобы компилятор делал хорошую работу, оптимизируя его, тогда не вызывайте никакой неотъемлемой функции внутри этого цикла.

2) Путь stdio-маршрута из контента зависит от реализации и может быть очень медленным. Если вы используете панель разработки для запуска кода, то stdio обычно реализуется через JTAG. В этом случае не только printf, но и все через stdio происходят крайне медленно. Если вы слишком сильно используете printf, вы легко достигнете предела времени.

3) Ваша целевая платформа может не реализовать stdio. Это распространено для встроенной платформы, потому что они EMBEDDED в чем-то еще и могут не иметь простого способа маршрутизации содержимого в или из.

На ваш вопрос: да и нет.

Да: есть утилиты трассировки, которые разработаны как легкие и быстрые и могут использоваться как более быстрая альтернатива printf, например, GT_TRACE от Texas Instruments для их DPS. В отличие от printf, трассировка может быть легко отключена во время выполнения и времени компиляции. Когда они выключены, они занимают очень мало времени.

No: следовые утилиты не являются стандартными C. Они, как правило, являются частью SDK вашей целевой платформы

Нижняя линия: на данный момент, не думаю об этом слишком много. Замените printfs трассировкой при переходе на встроенную платформу, если это необходимо.

Смежные вопросы