「C言語/サンプル/C言語の文字列の連結」の編集履歴(バックアップ)一覧はこちら

C言語/サンプル/C言語の文字列の連結」(2012/10/21 (日) 16:42:01) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

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>)

表示オプション

横に並べて表示:
変化行の前後のみ表示: