C言語の文字列の連結は大まかに以下の3通りの手段が考えられます。
- strcat関数を使う
- memcpy関数を使う
- sprintf関数を使う
この中でもsprintfは以下のような書き方ができて便利なのですが、性能は他の方法に比べると劣ります。
どれくらい劣るのかベンチマークしてみると結果は以下のようになりました。
方法 |
ミリ秒 |
strcat |
75 |
memcpy |
263 |
sprintf |
730 |
memcpyを使うのが一番早いかと思ったのですが、わたしの環境ではstrcatが75ミリ秒と一番速く驚きました。
ideoneの結果はmemcpyが一番早いので、わたしの環境がおかしいのかもしれません。
sprintfはstrcatの10倍の時間がかかっているので、性能にシビアな時は使わないほうがよさそうです。
ideoneでの実行結果
方法 |
ミリ秒 |
strcat |
120,000 |
memcpy |
70,000 |
sprintf |
250,000 |
サンプルダウンロード
サンプルソース
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
int main(void) {
char a[100];
char b[100] = "hogehogehogehogehogehoge";
char c[100] = "mogemogemogemogemogemoge";
int i = 0;
size_t sa, sb;
long start, end;
//strcpy+strcat
start = clock();
for (i = 0; i < 1000000; i++) {
strcpy(a, b);
strcat(a, c);
}
end = clock();
printf("strcpy+sarcat %ldミリ秒\n", end - start);
//memcpy
start = clock();
for (i = 0; i < 1000000; i++) {
sa = strlen(a);
sb = strlen(b);
memcpy(a, b, sa);
memcpy(a + sa, c, sb + 1);
}
end = clock();
printf("memcpy %ldミリ秒\n", end - start);
// sprintf
start = clock();
for (i = 0; i < 1000000; i++) {
sprintf(a, "%s%s", b, c);
}
end = clock();
printf("sprintf %ldミリ秒\n", end - start);
puts(a);
return EXIT_SUCCESS;
}
最終更新:2012年10月21日 16:42