почему c ++ std :: string.length () медленнее, чем strlen () на VS2017? - PullRequest
0 голосов
/ 14 ноября 2018

Я протестировал функцию c ++ std::string.length() против strlen() на VS2017 , как показано ниже.Результат:

msvs 2017

меня удивило то, что string.length() на 7x медленнее, чем strnlen().Но я полагаю, что string.length() - это операция O(1), а strlen() - операция O(n).

Я также проверил ее на GNU GCC v7.1.1 на основании кодирования

И это показывает, что string.length() немного быстрее , чем strlen() (не так, как я ожидал.)

enter image description here

Почему это?что-то не так в моем тестовом коде?

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;
}

1 Ответ

0 голосов
/ 14 ноября 2018

Чтобы ответить на мой вопрос:

Как предложено @Ken Y-N и @PaulMcKenzie, я локализую область действия stopwatch, чтобы исключить время cout, и строю ее с помощью Release build. Результат имеет смысл для меня сейчас!

enter image description here

...