Самый эффективный метод печати «теста»?

Печатать что-то, потребляя наименьшее количество ресурсов.

это может быть даже 0 или 1 не обязательно test

 fputs("test",stdout); printf("%s", "test"); puts("test"); 

Какая из приведенных выше команд является наиболее эффективной?

есть ли что-то еще более эффективное?

Здесь есть два ответа.

(1) Практически во всех практических целях нет никакой разницы в производительности (времени или других используемых ресурсах) между

 puts("test"); fputs("test\n",stdout); printf("%s\n", "test"); fprintf(stdout, "%s\n", "test"); 

(Есть несколько отличий в отношении обработки новой строки, как показано.)

Используйте тот, который наиболее ясен и имеет смысл для вашей программы; не беспокойтесь об эффективности здесь.

(2) Любой вопрос о форме «какой из них самый быстрый?» можно ответить только в контексте конкретной среды и вообще не может быть предсказано. Если вам действительно все равно, у вас нет другого выбора, кроме как выполнить эмпирический тест в вашей конкретной среде. Помните, что, поскольку различия в производительности в лучшем случае незначительны (см. Ответ 1), вам, возможно, придется выполнить тысячи или миллионы тестов, чтобы получить статистически значимый ответ – и это в значительной степени подтверждает тот факт, что практически , любые различия, вероятно, не имеют значения.


Теперь, просто для удовольствия, я проверил тест. Вот небольшая программа для тестирования всех четырех альтернатив, а также системный вызов с низким уровнем write :

 #include  #include  int main() { int count = 100000000; time_t t1, t2; int delta; int i; t1 = time(NULL); for(i = 0; i < count; i++) puts("test"); t2 = time(NULL); delta = (int) t2 - t1; fprintf(stderr, "test 1: %d secs (%f prints/sec)\n", delta, (double)count/delta); t1 = t2; for(i = 0; i < count; i++) fputs("test\n", stdout); t2 = time(NULL); delta = (int) t2 - t1; fprintf(stderr, "test 2: %d secs (%f prints/sec)\n", delta, (double)count/delta); t1 = t2; for(i = 0; i < count; i++) printf("%s\n", "test"); t2 = time(NULL); delta = (int) t2 - t1; fprintf(stderr, "test 3: %d secs (%f prints/sec)\n", delta, (double)count/delta); t1 = t2; for(i = 0; i < count; i++) fprintf(stdout, "%s\n", "test"); t2 = time(NULL); delta = (int) t2 - t1; fprintf(stderr, "test 4: %d secs (%f prints/sec)\n", delta, (double)count/delta); t1 = t2; for(i = 0; i < count; i++) write(1, "test\n", 5); t2 = time(NULL); delta = (int) t2 - t1; fprintf(stderr, "test 5: %d secs (%f prints/sec)\n", delta, (double)count/delta); } 

Вы заметите, что я решил запустить каждый тест сто миллионов раз . (Я не шучу, когда говорю «вам, возможно, придется выполнить тысячи или миллионы тестов».) Тем не менее, вот результаты:

 test 1: 9 secs (11111111.111111 prints/sec) test 2: 8 secs (12500000.000000 prints/sec) test 3: 17 secs (5882352.941176 prints/sec) test 4: 16 secs (6250000.000000 prints/sec) test 5: 45 secs (2222222.222222 prints/sec) 

Итак, в некотором смысле, мой ответ (1) был неправильным. Есть разница: puts и fputs примерно в два раза быстрее, чем printf и fprintf , по крайней мере, на моей машине. Но тот факт, что мне пришлось называть их сто миллионов раз, чтобы увидеть это различие, показывает, что на современной машине, если вы делаете всего несколько десятков или сотен или тысяч или даже миллионы или десятки миллионов звонков, вы вероятно, не увидит никакой разницы вообще.

[PS Моя тестовая программа не является строго переносимой. Я должен был использовать long int для счетчика.]

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

Обратите внимание, что puts("test"); после слова записывает новую строку. Если вам нужна новая линия, это может быть самым чистым решением. Если вы не хотите новую линию, используйте одну из двух других.

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