C言語を学習するときに、多くの場合、文字列の出力としてprintf関数を使うだろう。しかしながら、printfは強力な関数であり、特定の書式に従うことで比較的自由な文字列を出力することができるが、ただ単に固定の文字列を出力したいだけならオーバースペックな関数でもある。また、使い方を誤ると思わぬ問題を引き起こす問題も想定されるため、ただ単に文字列を表示したいだけなら代替としてputs関数が使える。さて、ここではprintfとputs関数のパフォーマンス差を比較してみた。
コード
printfを使用した場合
[code lang=”c”]#include <stdio.h>
#include <stdlib.h>
int main() {
for (int cnt = 0; cnt < 65535; cnt++) {
printf("hello,world\n");
}
return EXIT_SUCCESS;
}[/code]
putsを使用した場合
[code lang=”c”]#include <stdio.h>
#include <stdlib.h>
int main() {
for (int cnt = 0; cnt < 1000000; cnt++) {
puts("hello,world");
}
return EXIT_SUCCESS;
}[/code]
時間の比較
使用した環境
- OS – OS X Yosemite
- コンパイラ – Apple LLVM Clang 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn)
- CPU – Intel Core i7 2.2GHz
- メモリ – DDR3 1333MHz 8GB
65,536回
printf
- 0.203s
- 0.171s
- 0.164s
- 0.187s
- 0.197s
puts
- 0.174s
- 0.191s
- 0.155s
- 0.157s
- 0.195s
1,000,000回
printf
- 2.944s
- 2.946s
- 2.974s
- 2.986s
- 2.998s
puts
- 2.878s
- 2.896s
- 2.908s
- 2.901s
- 2.925s
所感
65,536回でテストした場合は気持ち的にputsの方がprintfよりも速度が速い印象がある点を除けばそれほど大きな差は確認できず、1,000,000回でテストした場合はループ回数も増えたためか、putsの方が若干動作速度が速いということは当方の環境で確認できた。
とはいえ、テスト用途ならともかく、出力のためだけに1,000,000回もループするようなことはあまり考えられず(仮に出力がループしても他の処理が入ると考えられる)、今日のPCの性能では、printfを使ってもputsを使ってもそれほど大きなパフォーマンス差は得られないものと考えられる。
最後に
今回のテストで大量のループ処理を行った場合をイメージしてやってみたが、今日のPC環境においては極端に大量の出力ループ処理でも行わない限り、putsで行ってもprintfで行っても処理速度的には大差ないことは確認できた。
そのため、実際にプログラムするにあたってはprintfの使い方に気をつければ、パフォーマンス上わざわざputsを使う必要もなさそうである。
ウェブマスター。本ブログでITを中心にいろいろな情報や意見などを提供しています。主にスマートフォン向けアプリやウェブアプリの開発を携わっています。ご用の方はコメントかコンタクトフォームにて。