質問
string
C++ Primer 第 4 版で私が信じているように、C スタイルの文字列操作は、平均してライブラリ クラスの操作よりも 5 倍遅く実行されるというのは本当ですか?
何で質問する?
実際にパフォーマンス テストを行ったところ、C スタイルの文字列は特定の例 (本で使用されているもの) で約 50% 高速であることが判明したためです。
設定
私はC++ Primer, 4th Editionを読んでいます.138ページにこのコードがリストされています:
// C-style character string implementation
const char *pc = "a very long literal string";
const size_t len = strlen(pc +1); // space to allocate
// performance test on string allocation and copy
for (size_t ix = 0; ix != 1000000; ++ix) {
char *pc2 = new char[len + 1]; // allocate the space
strcpy(pc2, pc); // do the copy
if (strcmp(pc2, pc)) // use the new string
; // do nothing
delete [] pc2; // free the memory
}
// string implementation
string str("a very long literal string");
// performance test on string allocation and copy
for(int ix = 0; ix != 1000000; ++ix) {
string str2 = str; // do the copy, automatically allocated
if (str != str2) // use the new string
; // do nothing
} // str2 is automatically freed
ここで、2行目でそれを認識していることstrlen(pc +1)
、および最初は配列for
を使用size_t
していますが添字を付けていないため、そうであった可能性があることを覚えておいてint
ください。
このコードをテストすると (strlen(pc) + 1
これは意図したものと思われます)、最初のブロックは 2 番目のブロックよりも約50% 高速に実行されるという結果になりました。これは、 C スタイルの文字列がこの特定のライブラリ文字列クラスよりも高速であるという結論につながります。例。
ただし、上記のコードに関連する本 (139 ページ) に書かれていることから、何かが欠けていると思います (おそらく明らかです)。
たまたま、平均して、文字列クラスの実装は C スタイルの文字列関数よりもかなり高速に実行されます。5 年以上前の PC での相対的な平均実行時間は次のとおりです。
user 0.47 # string class
user 2.55 # C-style character string
それで、それはどれですか?より長い文字列リテラルを使用する必要がありましたか? 彼らは GNU C Compiler を使用し、私は Microsoft のコンパイラを使用したためでしょうか? より高速なコンピューターを使用しているからでしょうか。
それとも、この本は間違っていますか?
編集
80x86 用 Microsoft (R) 32 ビット C/C++ 最適化コンパイラ バージョン 16.00.40219.01