Why do std::string operations perform poorly?

后端 未结 12 1683
误落风尘
误落风尘 2020-12-22 23:43

I made a test to compare string operations in several languages for choosing a language for the server-side application. The results seemed normal until I finally tried C++,

12条回答
  •  刺人心
    刺人心 (楼主)
    2020-12-23 00:22

    So I went and played a bit with this on ideone.org.

    Here a slightly modified version of your original C++ program, but with the appending in the loop eliminated, so it only measures the call to std::string::find(). Note that I had to cut the number of iterations to ~40%, otherwise ideone.org would kill the process.

    #include 
    #include 
    
    int main()
    {
        const std::string::size_type limit = 42 * 1024;
        unsigned int found = 0;
    
        //std::string s;
        std::string s(limit, 'X');
        for (std::string::size_type i = 0; i < limit; ++i) {
            //s += 'X';
            if (s.find("ABCDEFGHIJKLMNOPQRSTUVWXYZ", 0) != std::string::npos)
                ++found;
        }
    
        if(found > 0)
            std::cout << "Found " << found << " times!\n";
        std::cout << "x's length = " << s.size() << '\n';
    
        return 0;
    }
    

    My results at ideone.org are time: 3.37s. (Of course, this is highly questionably, but indulge me for a moment and wait for the other result.)

    Now we take this code and swap the commented lines, to test appending, rather than finding. Note that, this time, I had increased the number of iterations tenfold in trying to see any time result at all.

    #include 
    #include 
    
    int main()
    {
        const std::string::size_type limit = 1020 * 1024;
        unsigned int found = 0;
    
        std::string s;
        //std::string s(limit, 'X');
        for (std::string::size_type i = 0; i < limit; ++i) {
            s += 'X';
            //if (s.find("ABCDEFGHIJKLMNOPQRSTUVWXYZ", 0) != std::string::npos)
            //    ++found;
        }
    
        if(found > 0)
            std::cout << "Found " << found << " times!\n";
        std::cout << "x's length = " << s.size() << '\n';
    
        return 0;
    }
    

    My results at ideone.org, despite the tenfold increase in iterations, are time: 0s.

    My conclusion: This benchmark is, in C++, highly dominated by the searching operation, the appending of the character in the loop has no influence on the result at all. Was that really your intention?

提交回复
热议问题