2015-12-11 8 views
9

私はCでプログラムを書いているときに、しばしば改行を単独で印刷する必要があります。私はあなたが少なくとも2つの方法でこれを行うことができることを知っています:printf("\n")putchar('\n')しかし、私はどちらの方法がスタイルとおそらく効率の面で最良の選択であるかわかりません。 1つを他のものより上で使用するためのベストプラクティスはありますか?それは本当に重要ですか?Cで改行を印刷するにはprintf( " n")かputchar( ' n')を使うべきですか?

+14

の最適化のこの種のを心配する価値はほとんどないではありません。 :) – Almo

+0

時期尚早な最適化を心配する – KevinDTimm

+4

'puts(" ");'はどうでしょうか? – chux

答えて

18

最新のコンパイラを使用している場合には、どちらの選択肢も違いはありません[1]。たとえば、次のCコードを参考にしてください。

#include <stdlib.h> 
#include <stdio.h> 

void foo(void) { 
    putchar('\n'); 
} 

void bar(void) { 
    printf("\n"); 
} 

gcc -O1してコンパイル(最適化が有効になって)、我々はfoobarの両方で、次の(同一の)マシンコードを取得する:

movl $10, %edi 
popq %rbp 
jmp _putchar    ## TAILCALL 

両方foobarputchar('\n')を呼び出して終了します。言い換えれば、最新のCコンパイラは、printfの呼び出しを非常に効率的に最適化するほどスマートです。もっと明確で読みやすいと思うものを使ってください。


  1. 私はMSのclは、近代的なコンパイラであることを考慮していません。
+1

@ikegami - 私も頑張った。 'icc'も試してみることができますが、市販のコンパイラがgccよりも最適化されていないとすごく驚いています。関連するノートでは、gccは代わりに 'puts'の呼び出し(改行で終わると仮定します)の代わりに、ただ1つの引数(書式指定子を持たない書式文字列)で' printf'を変更することも観察しました。 – DaoWen

+0

@DaoWen: "市販のコンパイラがgccよりも最適化されていれば非常に驚くだろう" ...組み込みシステム用のコンパイラを知っていますか?あなたは驚くだろう。そして、一般的に、私は、gccが他のどのコンパイラよりも悪化していることを暗示するわけではありません。 – Olaf

+0

@Olaf - 私は組込みシステムプログラミングは、今日、本当にサブコンパイルされたコンパイラで立ち往生できる数少ない場所の1つだと思います。通常、標準ライブラリのサポートには欠けています。私がプログラムした最後の組み込みシステムには 'printf'も' malloc'もありませんでした。その場合、 'putchar( '\ n')'と一緒に行かなければなりません。 ;) – DaoWen

3

printfは、実行時にフォーマット文字列が解析されるため、はるかに低速です。もちろん、平均的な宿題プログラムや単純なProject Eulerソリューションは非常に小さく、数CPUサイクルを無駄にしても問題はありません。

+1

多くのCコンパイラは、_compile_ timeで定数書式文字列を解析し、最適化されたコードを作成します。 – chux

+1

そして多くはしません。 – nicomp

+3

まだ、コンパイラがこの簡単なコードを最適化しない場合、OPの最適化の努力は、 'printf(" \ n ")対' putchar( '\ n') 'ではなく、より良いコンパイラを探すのに適しています。 – chux

3

printfの文字列を解析する必要があるため、私はputcharとします。やや速いはずですが、おそらくそれほど多くはありません。

5

本当に問題ではありません。私は、コンソールに印刷することは、機能の選択肢や効率の面で誰かに問題があったことは決してありませんでした。

+0

コンソールに印刷すると、印刷していないプログラムと比較して実行中のプログラムが大幅に遅くなります。違いは大きい。簡単なテストを試してみましょう:wite a forループは百万に数え、それ以外は何もしないで、ループステートメントの中にprintステートメントを追加します。 – nicomp

+1

もちろんそれは遅くなります。ポイントは、pritnfとputcharの違いは厄介なものではないということです。コンソールへの印刷がボトルネックであれば、何か間違っていることになります。 –

+0

コンソールへの印刷がプログラムの目的なら、あなたは間違ったことをしていません。 – nicomp

4

printfputcharはどちらもstdio関数なので、(ファイル記述子に直接ではなく)同じFILEハンドルに書き込みます。

しかし、printfは、最初の引数が置換式とエスケープのためにスキャンする必要がある書式文字列であるため、はるかに重いです。

したがって、printf("\n")putchar('\n')の両方が同じことを行いますが、後者は高速になります。

8

もう一方を使用するためのベストプラクティスはありますか?

スタイルを意識させる。

実行の効率が同じまたはほぼ同じであるため、大きなコードの機能を最もよく伝えるスタイルを使用します。

printf()の機能が多い場合は、printf("\n")のままにしてください。

は同様にputchar('\n')puts("")

関連する問題