Я хочу найти префикс в строке. Я использую это:Есть ли альтернатива strncmp C++ 11, которая также работает?
if (s.substr (0, 7) == "prefix_")
...
В то время как это работает, относительно медленнее, чем strncmp
, как показано на этом тесте:
#include <iostream>
#include <chrono>
#include <string>
#include <string.h>
int main()
{
std::string s = "prefix_this is a passing test that will always match";
auto t0 = std::chrono::high_resolution_clock::now();
for (int i = 0; i < 1000000; i++)
if (s.substr (0, 7) == "prefix_")
;
auto t1 = std::chrono::high_resolution_clock::now();
for (int i = 0; i < 1000000; i++)
if (! s.compare (0, 7, "prefix_", 0, 7))
;
auto t2 = std::chrono::high_resolution_clock::now();
for (int i = 0; i < 1000000; i++)
if (! strncmp (s.c_str(), "prefix_", 7))
;
auto t3 = std::chrono::high_resolution_clock::now();
std::cout << "[1] s.substr (0, 7) == \"prefix_\" "
<< std::chrono::duration_cast<std::chrono::microseconds>(t1 - t0).count()
<< " μs\n"
<< "[2] ! strncmp (s.c_str(), \"prefix_\", 7) "
<< std::chrono::duration_cast<std::chrono::microseconds>(t2 - t1).count()
<< " μs\n"
<< "[3] ! s.compare (0, 7, \"prefix_\", 0, 7) "
<< std::chrono::duration_cast<std::chrono::microseconds>(t3 - t2).count()
<< " μs\n";
return 0;
}
Я вижу этот спектакль, который удивил меня:
[1] s.substr (0, 7) == "prefix_" 33022 μs
[2] ! strncmp (s.c_str(), "prefix_", 7) 32547 μs
[3] ! s.compare (0, 7, "prefix_", 0, 7) 12953 μs
Я бы предпочел использовать C++ 11, не отбрасывая обратно в libc, но результаты не очень хорошие.
Я уверен, что нет абсолютно никакой неуклюжий компилятор выбирает, учитывая, что в результате из этих сравнений совершенно непривычны. – Puppy
Что не так с опцией №3, точно? Кажется, что вы ищете? Что касается «сюрприза», # 1 создает временную строку, а # 2 должен выполнить дополнительную проверку для '\ 0' для каждого сравнения символов. –
Можете ли вы предоставить ориентиры для 'strcmp', цель, которую вы также должны бить? –