Quando sto scrivendo un programma in C, spesso devo stampare una nuova riga da sola. So che puoi farlo in almeno due modi: printf("\n")
e putchar('\n')
, ma non sono sicuro di quale sia la scelta migliore in termini di stile ed eventualmente di efficienza. Ci sono delle buone pratiche per l'utilizzo l'una sull'altra? Importa davvero?Devo usare printf (" n") o putchar (' n') per stampare una nuova riga in C?
risposta
Non farà alcuna differenza quale si è scelto se si utilizza un compilatore moderno [1]. Prendi ad esempio il seguente codice C.
#include <stdlib.h>
#include <stdio.h>
void foo(void) {
putchar('\n');
}
void bar(void) {
printf("\n");
}
Quando viene compilato con gcc -O1
(ottimizzazioni abilitati), si ottiene la seguente (identici) codice macchina sia foo
e bar
:
movl $10, %edi
popq %rbp
jmp _putchar ## TAILCALL
Sia foo
e bar
finiscono chiamata putchar('\n')
. In altre parole, i compilatori C moderni sono abbastanza intelligenti da ottimizzare le chiamate printf
in modo molto efficiente. Usa semplicemente quello che pensi sia più chiaro e leggibile.
- non ritengo di
cl
MS per essere un compilatore moderno.
@ikegami - Ho provato anche clang. Potrei provare anche 'icc', ma sarei * molto * sorpreso se un compilatore commerciale fosse ottimizzato più male di gcc. Su una nota correlata, ho anche osservato che gcc cambierà un 'printf' con un solo argomento (solo una stringa di formato senza specificatori di formato) in una chiamata a' puts' invece (assumendo che finisca con una nuova riga). – DaoWen
@DaoDao: "Sarei molto sorpreso se un compilatore commerciale ottimizzato più male di gcc" ... conosci il compilatore per i sistemi embedded? Saresti sorpreso. E in generale, non implicherei che Gcc si ottimizzi peggio di qualsiasi altro compilatore - commerciale o meno. – Olaf
@Olaf - Direi che la programmazione dei sistemi embedded è uno dei pochi posti in cui è possibile rimanere bloccati con un compilatore davvero parziale oggi. Di solito manca anche il supporto della libreria standard. L'ultimo sistema integrato programmato per me non aveva né 'printf' né' malloc', quindi in quel caso, credo che dovrei andare con 'putchar ('\ n')'. ;) – DaoWen
printf è molto più lento perché la stringa di formato viene analizzata in fase di esecuzione. Ovviamente, il programma di compiti a casa medio o la semplice soluzione di Project Euler sono così piccoli che non è necessario comunque sprecare alcuni cicli di CPU.
Molti compilatori C analizzano una stringa di formato costante in tempo _compile_ e creano codice ottimizzato. – chux
E molti no. – nicomp
Vero, ma se il compilatore non ottimizza questo codice banale, allora lo sforzo di ottimizzazione dell'OP è meglio speso alla ricerca di un compilatore migliore piuttosto che 'printf (" \ n ")' vs. 'putchar ('\ n')'. – chux
Vorrei andare con putchar
come la stringa in printf
deve essere analizzata. Dovrebbe essere leggermente più veloce - ma probabilmente non molto in esso.
Non importa. Non ho mai visto un caso in cui la stampa sulla console abbia mai avuto importanza per qualcuno in termini di scelta delle funzioni o efficienza.
La stampa sulla console rallenta drasticamente un programma in esecuzione relativo alla mancata stampa. La differenza è enorme. Prova un semplice test: wite un ciclo for che conta fino a un milione e non fa nient'altro, quindi aggiungi un'istruzione print all'interno del corpo del loop. – nicomp
ovviamente rallenta. il punto è che la differenza tra pritnf e putchar non vale nemmeno la pena di preoccuparsi. se la stampa sulla console è il collo di bottiglia, stai facendo qualcosa di sbagliato. –
Se la stampa sulla console è lo scopo del programma, non stai facendo qualcosa di sbagliato. – nicomp
printf
e putchar
sono entrambe funzioni stdio, quindi entrambi scrivono nello stesso handle FILE
(anziché direttamente nel descrittore di file).
Tuttavia, printf
è molto più pesante poiché il primo argomento è una stringa di formato che deve essere scansionata per le espressioni sostitutive e gli escape.
Quindi, sia lo printf("\n")
che lo putchar('\n')
faranno la stessa cosa, ma quest'ultimo sarà più veloce.
Esistono buone pratiche per l'utilizzo l'uno rispetto all'altro?
Lascia che lo stile guidi la decisione.
Poiché l'efficienza di esecuzione è la stessa o quasi identica, utilizzare lo stile che meglio esprime la funzione del codice più grande.
Se la funzione aveva un numero di printf()
, rimanere con printf("\n")
.
Allo stesso modo per putchar('\n')
e puts("")
- 1. È una nuova riga = \ n OR \ r \ n?
- 2. Regex che corrisponde a una nuova riga (\ n) in C#
- 3. Cosa succede con Java "% n" in printf?
- 4. Qual è la differenza tra '\ n' o "\ n" in C++?
- 5. bash printf con nuova riga
- 6. Trasmettere carattere di nuova riga "\ n"
- 7. Stampa caratteri n spazio - (f) formato printf
- 8. O-grande complessità del c^n + n * (log n)^2 + (10 * n)^c
- 9. Come "\ n", "\ t" aggiunge una nuova riga e scheda rispettivamente?
- 10. Che cos'è il carattere di nuova riga - '\ n'
- 11. echo "-n" non stampa -n?
- 12. Perché "\ n" fornisce una nuova riga su Windows?
- 13. Interpretazione '\ n' in printf ("% s", stringa)
- 14. Come posso stampare correttamente una nuova riga in Haskell?
- 15. C# interruzione di riga ogni n caratteri
- 16. Stringa JavaScript con nuova riga - ma non in uso \ n
- 17. Lanciare Y o N per boolare C#
- 18. Come si aggiunge una nuova riga usando printf?
- 19. Possiamo calcolarlo in meno di O (n * n) ... (nlogn o n)
- 20. Come impedire a grep di stampare una nuova riga finale?
- 21. sostituisci \ n con codice carattere attuale nuova riga
- 22. Come posso stampare una nuova riga senza svuotare il buffer?
- 23. -O2 ottimizza printf ("% s \ n", str) per puts (str)
- 24. Intersezioni cerchio di calcolo in O ((n + s) log n)
- 25. Come stampare \ n in una stringa in java
- 26. n ** n ** n euristica in Python
- 27. Come stampare con precisione la nuova riga in Groovy?
- 28. Scala: sliding (N, N) vs grouped (N)
- 29. NSString isEqualToString: per \ n
- 30. Corrispondenza a^n b^n c^n (ad esempio "aaabbbccc") utilizzando le espressioni regolari in C#
Questo tipo di ottimizzazione è quasi mai vale la pena preoccuparsi. :) – Almo
attenti all'ottimizzazione prematura – KevinDTimm
Che dire di 'puts (" ");'? – chux