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/call

FPC compiles itself 0.03% faster: 144K vals run in 3.7 → 1.5 ms out of 8 s.

Merge request reports

Loading
Loading