C言語の文字列の連結は大まかに以下の3通りの手段が考えられます。

  1. strcat関数を使う
  2. memcpy関数を使う
  3. sprintf関数を使う

この中でもsprintfは以下のような書き方ができて便利なのですが、性能は他の方法に比べると劣ります。
sprintf(buff, "%s%s", stra, strb);

どれくらい劣るのかベンチマークしてみると結果は以下のようになりました。
方法 ミリ秒
strcat 75
memcpy 263
sprintf 730
memcpyを使うのが一番早いかと思ったのですが、わたしの環境ではstrcatが75ミリ秒と一番速く驚きました。
ideoneの結果はmemcpyが一番早いので、わたしの環境がおかしいのかもしれません。
sprintfはstrcatの10倍の時間がかかっているので、性能にシビアな時は使わないほうがよさそうです。

ideoneでの実行結果
方法 ミリ秒
strcat 120,000
memcpy 70,000
sprintf 250,000

サンプルダウンロード

strcat.zip
strcat.c
zipはサンプルソースと実行ファイルが入っています。
実行ファイルをダウンロードしたくない人はソースだけダウンロードしてください。

サンプルソース

#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
添付ファイル