в VBA / QTP как работает сравнение строк?Есть ли эффективная встроенная функция хеширования строк? - PullRequest
1 голос
/ 11 января 2011

Мне нужно сравнить две очень большие строки в QTP (я полагаю, что они получены из движка vba). Я знаю, что эти строки будут превышать 100 000 символов, и мне нужно иметь возможность определять, когда происходит изменение в одной из этих больших строк. Для начала я использовал следующее:

если prevtext <> currenttext тогда ... конец если

Я ожидал, что это взорвется, но на самом деле скрипт работал довольно быстро. Во время сравнения строк заметного замедления не было. Итак, я подозреваю, что сравнение строк на самом деле усекает строки вне моей области видимости или делает что-то еще, что было бы обманом. Кто-нибудь знает, могу ли я действительно полагаться на встроенный оператор сравнения строк для сравнения двух строк из 100 000 символов? Если нет, то есть ли какая-нибудь встроенная функция хеширования, которой я могу заменить это? Ему просто нужно уметь обнаруживать изменения, а не их содержание, и он должен работать быстро.

Ответы [ 3 ]

0 голосов
/ 11 января 2011

Сравнение строк на любом нормальном языке выполняется за линейное время. Алгоритм хеширования не улучшит скорость сравнения строк, если только строки не обновляются очень редко и хешируются при обновлении (в отличие от хеширования перед сравнением) Для этого потребуется изменить приложение, чтобы оно содержало структуру Strings и связанный с ними хеш.

0 голосов
/ 11 января 2011

Не похоже, что есть какая-либо оптимизация (очевидной оптимизацией будет проверка того, имеют ли строки одинаковую длину), однако при сравнении 1000000 строк символов это занимает менее 0,1 секунды, поэтому я не думаю, что вам следует беспокоиться о 100K символьных строк.

Вот как я это проверил.

base = String(1000000, "x")
first = base & "a"
sameLength = base & "b"
differentLength = base & "cd"

MercuryTimers.Timer("x").Start
diff = first <> sameLength
print "sameLength = " & diff & " after " & MercuryTimers.Timer("x").ElapsedTime
MercuryTimers.Timer("x").Reset

MercuryTimers.Timer("x").Start
diff = first <> differentLength
print "differentLength = " & diff & " after " & MercuryTimers.Timer("x").ElapsedTime
MercuryTimers.Timer("x").Reset

Синхронизированные выходы были примерно одинаковыми, вот типичный выход (время в миллисекундах)

sameLength = True после 40
differentLength = True после 30

0 голосов
/ 11 января 2011

VBA допускает около 2 миллиардов символов: http://social.msdn.microsoft.com/Forums/en-US/isvvba/thread/a1d8ee65-75e6-4a29-9670-6e233c398642

...