「C言語/サンプル/C言語の文字列の連結」の編集履歴(バックアップ)一覧はこちら
追加された行は緑色になります。
削除された行は赤色になります。
C言語の文字列の連結は大まかに以下の3通りの手段が考えられます。
+ strcat関数を使う
+ memcpy関数を使う
+ sprintf関数を使う
この中でもsprintfは以下のような書き方ができて便利なのですが、性能は他の方法に比べると劣ります。
#highlight(c){{sprintf(buff, "%s%s", stra, strb);}}
どれくらい劣るのかベンチマークしてみると結果は以下のようになりました。
|方法|ミリ秒|
|strcat|RIGHT:75|
|memcpy|RIGHT:263|
|sprintf|RIGHT:730|
memcpyを使うのが一番早いかと思ったのですが、わたしの環境ではstrcatが75ミリ秒と一番速く驚きました。
ideoneの結果はmemcpyが一番早いので、わたしの環境がおかしいのかもしれません。
sprintfはstrcatの10倍の時間がかかっているので、性能にシビアな時は使わないほうがよさそうです。
ideoneでの実行結果
|方法|ミリ秒|
|strcat|RIGHT:120,000|
|memcpy|RIGHT:70,000|
|sprintf|RIGHT:250,000|
*** サンプルダウンロード
&ref(strcat.zip)
zipはサンプルソースと実行ファイルが入っています。
実行ファイルをダウンロードしたくない人はソースだけダウンロードしてください。
&ref(strcat.c)
*** サンプルソース
#highlight(c){{
#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;
}
}}
&html(<script type="text/javascript" src="http://ideone.com/api/embed.js/link/WwFWTE"></script>)
C言語の文字列の連結は大まかに以下の3通りの手段が考えられます。
+ strcat関数を使う
+ memcpy関数を使う
+ sprintf関数を使う
この中でもsprintfは以下のような書き方ができて便利なのですが、性能は他の方法に比べると劣ります。
#highlight(c){{sprintf(buff, "%s%s", stra, strb);}}
どれくらい劣るのかベンチマークしてみると結果は以下のようになりました。
|方法|ミリ秒|
|strcat|RIGHT:75|
|memcpy|RIGHT:263|
|sprintf|RIGHT:730|
memcpyを使うのが一番早いかと思ったのですが、わたしの環境ではstrcatが75ミリ秒と一番速く驚きました。
ideoneの結果はmemcpyが一番早いので、わたしの環境がおかしいのかもしれません。
sprintfはstrcatの10倍の時間がかかっているので、性能にシビアな時は使わないほうがよさそうです。
ideoneでの実行結果
|方法|ミリ秒|
|strcat|RIGHT:120,000|
|memcpy|RIGHT:70,000|
|sprintf|RIGHT:250,000|
*** サンプルダウンロード
&ref(strcat.zip)
&ref(strcat.c)
zipはサンプルソースと実行ファイルが入っています。
実行ファイルをダウンロードしたくない人はソースだけダウンロードしてください。
*** サンプルソース
#highlight(c){{
#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;
}
}}
&html(<script type="text/javascript" src="http://ideone.com/api/embed.js/link/WwFWTE"></script>)