据我所知,Delphi中的32位版本(经过XE5测试)多年前采用了FastCode汇编程序版本,但对于64位版本,它使用的是PurePascal版本,速度大约慢5到10倍.
一些测试,长循环中的相同过程:
32位:65..90ms
64位:280..300ms
@H_301_18@解决方法 使用Fastcoders
purepascal PosEx_Sha_Pas_2算法(修改为适合x64): function PosEx_Sha_Pas_2(const SubStr,S: string; Offset: Integer = 1): Integer;Type PInteger =^Integer;var len,lenSub: Integer; ch: char; p,pSub,pStart,pStop: pchar;label Loop0,Loop4,TestT,Test0,Test1,Test2,Test3,Test4,AfterTestT,AfterTest0,Ret,Exit;begin; pSub := pointer(SubStr); p := pointer(S); if (p = nil) or (pSub = nil) or (Offset < 1) then begin; Result := 0; goto Exit; end; lenSub := PLongInt(PByte(pSub) - 4)^ - 1; // <- ModifIEd len := PLongInt(PByte(p) - 4)^; // <- ModifIEd if (len < lenSub + Offset) or (lenSub < 0) then begin; Result := 0; goto Exit; end; pStop := p + len; p := p + lenSub; pSub := pSub + lenSub; pStart := p; p := p + Offset + 3; ch := pSub[0]; lenSub := -lenSub; if p < pStop then goto Loop4; p := p - 4; goto Loop0;Loop4: if ch = p[-4] then goto Test4; if ch = p[-3] then goto Test3; if ch = p[-2] then goto Test2; if ch = p[-1] then goto Test1;Loop0: if ch = p[0] then goto Test0;AfterTest0: if ch = p[1] then goto TestT;AfterTestT: p := p + 6; if p < pStop then goto Loop4; p := p - 4; if p < pStop then goto Loop0; Result := 0; goto Exit;Test3: p := p - 2;Test1: p := p - 2;TestT: len := lenSub; if lenSub <> 0 then repeat ; if (pSub[len] <> p[len + 1]) or (pSub[len + 1] <> p[len + 2]) then goto AfterTestT; len := len + 2; until len >= 0; p := p + 2; if p <= pStop then goto Ret; Result := 0; goto Exit;Test4: p := p - 2;Test2: p := p - 2;Test0: len := lenSub; if lenSub <> 0 then repeat ; if (pSub[len] <> p[len]) or (pSub[len + 1] <> p[len + 1]) then goto AfterTest0; len := len + 2; until len >= 0; Inc(p);Ret: Result := p - pStart;Exit:end;
结果使用DavID的测试用例(x64版本):
System.Pos 18427wcsstr 8122PosEx_Sha_Pas_2 2282
对于x32版本,结果如下:
System.Pos 2171wcsstr 9634PosEx_Sha_Pas_2 1868
结论:
在x32位模式下,PosEx_Sha_Pas_2在x64位模式下几乎和Pos一样快.
此外,似乎PosEx_Sha_Pas_2在x32位模式下比Pos快.
这里的所有测试都是使用XE4版本.
Improve purepascal System.Pos()仍在东京开放10.2.
总结以上是内存溢出为你收集整理的string – Delphi:64位快速Pos全部内容,希望文章能够帮你解决string – Delphi:64位快速Pos所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)