Сравнение скорости C++11 / стоимость std::hash<std::string>, равный std::string, равный непосредственно для 2 больших строк

Привет, у меня есть вопрос о std::hash, если у меня есть 2 большие строки для сравнения, и я согласен с тем, что std::hash будет сравниваться в большинстве случаев, если он более совместим с производительностью, чтобы сделать что-то вроде следующего вместо прямой сравнение строк? Также учтите, что это будет цикл чтения файла, поэтому он будет выполняться несколько раз, что является проблемой для больших файлов.

std::string largeString1;  // large but not huge meaning a line of text like up to lets say 500 chars 
std::string largeString2;

// is this better than then next block in terms of performance and if so by how much?
if ( std::hash<std::string>(largeString1) == std::hash<std::string>(largeString2) )
{
// true logic
}

// is this a lot slower than the previous
if ( largeString1 == largeString2 )
{
// true logic
}

1 ответ

Решение
std::hash<std::string>(largeString1) == std::hash<std::string>(largeString2)

Будет намного медленнее чем

largeString1 == largeString2

Хэширование строки включает в себя итерацию по всей длине. Таким образом, для сравнения хэшей требуется, чтобы код повторял по всей длине обеих строк по одной и выполнял их через сложные уравнения. Код прямого равенства просто повторяет их в одно и то же время и сразу же завершает работу, как только обнаруживает разницу. Доверься библиотеке. Если == можно было бы сделать быстрее, они бы сделали это быстрее.

Если вы собираетесь сравнивать каждую строку много раз, то может быть быстрее выполнено хеширование один раз и сравнение только хешей, но вам все равно придется подтверждать совпадения, поскольку сравнение хешей может дать ложные срабатывания. Это только делает случай "не совпадает" быстрее.

Другие вопросы по тегам