繁体   English   中英

为什么 c++ std::string.length() 在 VS2017 上比 strlen() 慢?

[英]why c++ std::string.length() is slower than strlen() on VS2017?

我已经在VS2017上测试了 c++ std::string.length()strlen()函数,如下所示。 结果是:

msvs 2017

令我惊讶的是string.length()strnlen()7 倍 但我认为string.length()是一个O(1)操作,而strlen()是一个O(n)操作。

我还在 GNU GCC v7.1.1 的编码基础上对其进行了测试

它显示string.length()strlen()略快(不像我预期的那么。)

在此处输入图片说明

这是为什么? 我的测试代码有问题吗?

class stopwatch
{
public:
    stopwatch()
    {
        start = std::chrono::system_clock::now();
    }
    ~stopwatch()
    {
        auto end = std::chrono::system_clock::now();
        auto elasped = std::chrono::duration_cast<std::chrono::microseconds>(end - start);
        cout << "elasped: " << elasped.count() << endl;
    }

private:
    chrono::system_clock::time_point start;
};

void test_std_str(const string& ss)
{
    stopwatch sw;
    const int max = 100000;
    int sum = 0;
    for (int i = 0; i < max; i++)
    {
        sum += ss.length();
    }
    cout<< "test_string: sum = " << sum << endl;
}

void test_c_str(const char* str)
{
    stopwatch sw;
    const int max = 100000;
    int sum = 0;
    for (int i = 0; i < max; i++)
    {
        sum += strlen(str);
    }
    cout << "test_c_str: sum = " << sum << endl;
}

int main()
{
    std::string ss = "abcdef";
    const char* str = "abcdef";
    int x;
    cin >> x;
    if (x > 0)
    {
        ss = "helloworld";
        str = "helloworld";
    }
    test_std_str(ss);
    test_c_str(str);
    return 0;
}

回答我自己的问题:

正如@Ken YN 和@PaulMcKenzie 所建议的,我将stopwatch的范围本地化以排除cout的时间,并使用Release build 构建它。 结果现在对我来说很有意义!

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM