¿El método más eficiente para imprimir “prueba”?

Para imprimir algo consumiendo la menor cantidad de recursos.

Incluso puede ser un 0 o 1 no necesariamente test

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

¿Cuál de los comandos anteriores es el más eficiente?

¿Hay algo más que sea más eficiente?

Básicamente hay dos respuestas aquí.

(1) Para casi todos los propósitos prácticos, no hay diferencia en el rendimiento (tiempo u otros recursos utilizados) entre

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

(Hay algunas diferencias con respecto al manejo de nueva línea, como se muestra.)

Use el que sea más claro y tenga sentido para su progtwig; No te preocupes por la eficiencia aquí.

(2) ¿Alguna pregunta de la forma “cuál de estos es más rápido?” solo se puede responder en el contexto de un entorno particular y, en general, no se puede predecir. Si realmente te importa, básicamente no tienes otra opción que realizar una prueba empírica en tu entorno exacto. Tenga en cuenta que dado que las diferencias en el rendimiento probablemente sean leves en el mejor de los casos (vea la respuesta 1), es posible que deba realizar miles o millones de pruebas para obtener una respuesta estadísticamente significativa, y esto refuerza bastante el punto que, prácticamente , cualquier diferencia probablemente no importa.


Ahora, solo por diversión, hice una prueba. Aquí hay un pequeño progtwig para probar las cuatro alternativas, junto con la llamada al sistema de write bajo nivel:

 #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); } 

Notarás que he elegido ejecutar cada prueba cien millones de veces . (No estaba bromeando cuando dije "es posible que tenga que realizar miles o millones de pruebas".) Sin embargo, aquí están los resultados:

 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) 

Entonces, en un sentido, mi respuesta (1) fue incorrecta. Hay una diferencia: los fputs y los fputs son aproximadamente el doble de rápidos que los de printf y fprintf , al menos en mi máquina. Pero el hecho de que tuve que llamarlos cien millones de veces para ver esta diferencia muestra que, en una máquina moderna, si estás haciendo solo unas pocas decenas o cientos o miles o incluso millones o decenas de millones de llamadas, Probablemente no verá ninguna diferencia en absoluto.

[PS Mi progtwig de prueba no es estrictamente portátil. Debería haber usado long int para el contador.]

Básicamente, no hay diferencia en el tiempo de ejecución entre las tres alternativas y algunos comstackdores de optimización realmente convertirán el printf en una llamada a algo como fputs . Así que ve por el que hace lo que quieres en lo que consideras la forma más clara.

Tenga en cuenta que puts("test"); escribe una nueva línea después de la palabra. Si quieres la nueva línea, esa puede ser la solución más limpia. Si no quieres la nueva línea, usa una de las otras dos.

Cuando intente optimizar el código, concéntrese en la imagen general. ¿Estás utilizando el mejor algoritmo? ¿Estás realizando un trabajo innecesario? ¿Podrías usar una mejor estructura de datos? Confíe en las personas que escribieron el comstackdor y la biblioteca estándar para haber realizado un buen trabajo de optimización de expresiones idiomáticas comunes. Son excelentes progtwigdores y su trabajo es centrarse en los pequeños detalles que harán que su código se ejecute más rápido.