output integers

入力関数に引き続き、出力関数を自作してみました。
非負整数の出力に特化しています。型の拡張(unsigned や long long)とか符号拡張は容易。

// 10進表記で出力し改行
void puti(int n) {
  if (!n) { fwrite("0\n", 1, 2, stdout); return; }
  char str[11];
  str[10] = '\n';
  int i = 10;
  while (n) {
    int m = n/10;
    str[--i] = '0' + n-m*10;
    n = m;
  }
  fwrite(str+i, 1, 11-i, stdout);
}

出力方法はいろいろ試したのですが、
fwrite() を使うのがもっとも高速になりました。



cout, printf と比較します。
100000個の整数を出力させた結果はおおよそ次のようになりました。

# cout << table[i] << endl;
real 0m0.129s
user 0m0.100s
sys 0m0.100s


# printf("%d\n", table[i]);
real 0m0.056s
user 0m0.070s
sys 0m0.000s


# puti(table[i]);
real 0m0.040s
user 0m0.050s
sys 0m0.000s

やっぱ printf/scanf はかなり速いんですね。

さらなる最適化のヒントがあれば教えて頂けると幸いです:-)