Я протестировал функцию c ++ std::string.length()
против strlen()
на VS2017 , как показано ниже.Результат:
меня удивило то, что string.length()
на 7x медленнее, чем strnlen()
.Но я полагаю, что 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;
}