besen icon indicating copy to clipboard operation
besen copied to clipboard

change hash function gives up to 22% speedup

Open tigrazone opened this issue 6 years ago • 9 comments

tigrazone avatar Oct 30 '17 18:10 tigrazone

Wow! Is the 22% speedup affects the entire library when executing JS code?

edwinyzh avatar Oct 31 '17 06:10 edwinyzh

not always. 3%-10% speedup when executing JS code. Maybe you rewrite my hash function in assembler? bottlenecks is copy functions, .Name = .Name + and balansed tree not too fast. I also change BESENANSIPos to Pos, BESENANSIPosChar to Pos, BESENANSIUpperCase to UpperCase and BESENANSITrim to Trim. It give me -500 bytes in exe ;-) Look at my last commit.

tigrazone avatar Oct 31 '17 06:10 tigrazone

.Name = .Name +can be changed to add widechars to array and then fast copy to .Name at finish of cycle

tigrazone avatar Oct 31 '17 12:10 tigrazone

@tigrazone

Maybe you rewrite my hash function in assembler?

Why just assembler? :) Try this: (taken from awesome blog (in russian))

function ShaPerfectHashStr(const s: RawByteString): integer;
var
  i: integer;
begin;
  Result:=0;
  for i:=0 to Length(s)-1 do Result:=(Result + ord(s[i+1]) + 1507220783) * 1041204193;
end;

Well, and assembler :) CRC32 parallel calculation CRC64 parallel calculation

data-man avatar Oct 31 '17 12:10 data-man

A few words about Aleksandr Sharahov. See Fastcode Winner's List Overview

data-man avatar Oct 31 '17 13:10 data-man

my hash function is simpler and faster function thrHashKey(const Key:TBESENString):TBESENHash; var i,h:longword; begin if length(key)<1 then begin result:=0; exit; end;

h:=ord(Key[1]); for i:=2 to length(Key) do begin h:=(h shl 5) - h + ord(Key[i]); end;

result:=h; end;

tigrazone avatar Nov 03 '17 16:11 tigrazone

@tigrazone Why do you call it your function? It is called X31Hash and it was invented by Karl Nelson more than 17 years ago.

data-man avatar Nov 03 '17 16:11 data-man

yes! it's X31Hash. same function used in TFPHashList Function FPHash(const s:shortstring):LongWord; var p,pmax : PChar; begin {$push} {$Q-} Result:=0; p:=@s[1]; pmax:=@s[length(s)+1]; while (p<pmax) do begin Result:=LongWord(LongInt(Result shl 5) - LongInt(Result)) xor LongWord(P^); Inc(p); end; {$pop} end;

tigrazone avatar Nov 03 '17 17:11 tigrazone

Well, then the FP developers also do not respect the merits and work of other people. This is not accepted in the open source community. Honest people are not accepted that way. And you had impudence to name a function by your name.

@BeRo1985 don't merge this PR, please.

data-man avatar Nov 03 '17 17:11 data-man