1. ホーム
  2. c++

[解決済み] 文字列の連結を最適化する方法

2023-07-05 11:28:03

質問

私たちは日常的に、コードの中で面倒で非常に多くの文字列操作を行わなければならない状況に常に遭遇しています。私たちは皆、文字列操作が高価な操作であることを知っています。私は、利用可能なバージョンの中で最も安価なものを知りたいと思います。

最も一般的な操作は連結です(これはある程度制御できるものです)。C++でstd::stringを連結する最良の方法と、連結を高速化するためのさまざまな回避策は何ですか?

ということです。

std::string l_czTempStr;

1).l_czTempStr = "Test data1" + "Test data2" + "Test data3";

2). l_czTempStr =  "Test data1"; 
    l_czTempStr += "Test data2";
    l_czTempStr += "Test data3";

3). using << operator

4). using append()

また、std::stringではなくCStringを使うことで何か利点があるのでしょうか?

どのように解決するのですか?

ここに小さなテストスイートがあります。

#include <iostream>
#include <string>
#include <chrono>
#include <sstream>

int main ()
{
    typedef std::chrono::high_resolution_clock clock;
    typedef std::chrono::duration<float, std::milli> mil;
    std::string l_czTempStr;
    std::string s1="Test data1";
    auto t0 = clock::now();
    #if VER==1
    for (int i = 0; i < 100000; ++i)
    {
        l_czTempStr = s1 + "Test data2" + "Test data3";
    }
    #elif VER==2
    for (int i = 0; i < 100000; ++i)
    {
        l_czTempStr =  "Test data1"; 
        l_czTempStr += "Test data2";
        l_czTempStr += "Test data3";
    }
    #elif VER==3
    for (int i = 0; i < 100000; ++i)
    {
        l_czTempStr =  "Test data1"; 
        l_czTempStr.append("Test data2");
        l_czTempStr.append("Test data3");
    }
    #elif VER==4
    for (int i = 0; i < 100000; ++i)
    {
        std::ostringstream oss;
        oss << "Test data1";
        oss << "Test data2";
        oss << "Test data3";
        l_czTempStr = oss.str();
    }
    #endif
    auto t1 = clock::now();
    std::cout << l_czTempStr << '\n';
    std::cout << mil(t1-t0).count() << "ms\n";
}

について コリル :

でコンパイルします。

clang++ -std=c++11 -O3 -DVER=1 -Wall -pedantic -pthread main.cpp

21.6463ms

<ブロッククオート

-DVER=2

6.61773ms

<ブロッククオート

-DVER=3

6.7855ms

<ブロッククオート

-DVER=4

102.015ms

次のように表示されます。 2) , += が勝者です。

(また、コンパイル時に -pthread もタイミングに影響するようです)