久々のプログラミングのネタです。
足跡を見ると、プログラムネタで検索してこのblogに来る人も結構いるんですね。

文字列置換の処置で、大規模データでテストしたらパフォーマンスが悪いという障害が発生しました。
5Mbyteのテキストファイル(置換文字列10万個)で再現テストを行ったところ、処理時間とCPU使用率が目も当てられない状況に。
調査したところ、strcat()関数が原因でした。
この関数は、内部で文字列の末尾を検出するのに1byteずつwhileループしているので、巨大なデータを渡すと遅くなります。
という訳で、strcat/strncatを使用しない方向で修正しました。


/* 修正前ロジック */
while()
{
  // 文字列を連結する
  strcat(w_new_buf, w_append_buf);
}

/* 修正後ロジック */
w_buf_tail = w_new_buf;
while()
{
  // 文字列を連結する(パフォーマンス改善)
  w_buf_tail = strncat_perf(w_buf_tail, w_append_buf, w_len);
}
char *strncat_perf(char *dst, chat *src, int len)
{
  // 文字列を連結し、連結後の末尾ポインタをreturn
  strncpy(dst, src, len);
  return (dst + len);
}

お気に入り日記の更新

この日記について

日記内を検索