2015-12-11 13 views
9

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?

+14

Questo tipo di ottimizzazione è quasi mai vale la pena preoccuparsi. :) – Almo

+0

attenti all'ottimizzazione prematura – KevinDTimm

+4

Che dire di 'puts (" ");'? – chux

risposta

18

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.


  1. non ritengo di cl MS per essere un compilatore moderno.
+1

@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

+0

@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

+0

@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

3

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.

+1

Molti compilatori C analizzano una stringa di formato costante in tempo _compile_ e creano codice ottimizzato. – chux

+1

E molti no. – nicomp

+3

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

3

Vorrei andare con putchar come la stringa in printf deve essere analizzata. Dovrebbe essere leggermente più veloce - ma probabilmente non molto in esso.

5

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.

+0

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

+1

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. –

+0

Se la stampa sulla console è lo scopo del programma, non stai facendo qualcosa di sbagliato. – nicomp

4

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.

8

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("")

Problemi correlati