2011-01-10 66 views
1

我需要比較QTP中的兩個非常大的字符串(我相信由vba衍生的引擎解釋)。我知道這些字符串將超過100,000個字符,並且我需要能夠檢測到這些大字符串中的某個字符串是否發生了變化。要開始我用下面的:在VBA/QTP中字符串比較如何工作?是否有內置的高效字符串哈希函數?

如果prevtext <> currenttext然後 ... 結束時,如果

我期待這個爆炸,但實際上腳本運行速度相當快。字符串比較中沒有明顯的放緩。所以,我懷疑字符串比較實際上是截斷了我的作用域之外的字符串或者做了其他可能會作弊的字符串。有誰知道我是否實際上可以依靠內置的字符串比較運算符來比較兩個100,000個以上的字符串?如果不是有一些本地散列函數,我可以用它來替代?它只需要能夠檢測變化,而不是變化的內容,並且需要快速運行。

+1

QTP是基於VBScript的(不是VBA)我會更新你的標籤 – Motti 2011-01-11 07:04:59

回答

0

字符串比較,在任何理智的語言,以線性時間運行。哈希算法不會提高字符串比較速度,除非字符串僅更新得非常少,並且在更新時被哈希(而不是比較之前的哈希)。這將需要修改您的應用程序以包含字符串結構及其關聯的哈希。

+1

定義理智,明顯的優化是檢查字符串的長度是否相同(對於獲得長度爲O(1)的字符串,比如Java,.NET, C++的`std :: string `等) – Motti 2011-01-11 13:31:17

0

看起來好像沒有任何優化(明顯的優化是檢查字符串的長度是否相同),但是當比較1,000,000個字符串時,它不到0.1秒,所以我認爲你不應該擔心大約100K char字符串。

下面是我測試它的方法。

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 =真後40
differentLength =真後30