Loading
Faster Val().
Val overflows only when the amount of input digits reaches the length of the representation of the maximum. For example, a 2-byte base-10 unsigned number (max = 65,535, 5 digits) can overflow only at 5 digits.
This observation allows us to build a substantially faster (and smaller!) Val.
My results on ValBenchmark.pas:
x86-64 i386
Val('123', LongInt): 22 → 12 ns/call 23 → 14 ns/call
Val('-45678910', LongInt): 34 → 16 ns/call 46 → 23 ns/call
Val('-2147483648', LongInt): 39 → 25 ns/call 54 → 30 ns/call
Val('123', LongWord): 32 → 11 ns/call 19 → 11 ns/call
Val('45678910', LongWord): 67 → 16 ns/call 38 → 21 ns/call
Val('4294967295', LongWord): 82 → 24 ns/call 45 → 27 ns/call
Val('123', Int64): 21 → 11 ns/call 34 → 16 ns/call
Val('-45678910', Int64): 34 → 16 ns/call 64 → 31 ns/call
Val('-9223372036854775808', Int64): 60 → 34 ns/call 129 → 68 ns/call
Val('123', QWord): 32 → 11 ns/call 32 → 15 ns/call
Val('45678910', QWord): 68 → 16 ns/call 68 → 28 ns/call
Val('18446744073709551615', QWord): 153 → 34 ns/call 181 → 68 ns/callFPC compiles itself 0.03% faster: 144K vals run in 3.7 → 1.5 ms out of 8 s.