Если в функции HashTable_Func поставить const то результат (у меня) такой:
Без inline - 1513 ms
С inline - 3167 ms
Если смотреть код, то цикл _без_ inline:
Код: Выделить всё
@@j86:
inc esi
mov eax,offset _$TEST$_Ld1
call P$TEST_HASHTABLE_FUNC1$ANSISTRING$$LONGWORD
mov eax,offset _$TEST$_Ld3
call P$TEST_HASHTABLE_FUNC1$ANSISTRING$$LONGWORD
mov eax,offset _$TEST$_Ld5
call P$TEST_HASHTABLE_FUNC1$ANSISTRING$$LONGWORD
mov eax,offset _$TEST$_Ld7
call P$TEST_HASHTABLE_FUNC1$ANSISTRING$$LONGWORD
mov eax,offset _$TEST$_Ld9
call P$TEST_HASHTABLE_FUNC1$ANSISTRING$$LONGWORD
mov eax,offset _$TEST$_Ld11
call P$TEST_HASHTABLE_FUNC1$ANSISTRING$$LONGWORD
cmp esi,50000000
jl @@j86
где:
P$TEST_HASHTABLE_FUNC1$ANSISTRING$$LONGWORD:
sub esp,4
mov dword ptr [esp],eax
mov eax,dword ptr [esp]
call P$TEST_BKDRHASH$ANSISTRING$$LONGWORD
and eax,2147483647
add esp,4
ret
Цикл с inline:
Код: Выделить всё
@@j33:
inc esi
lea eax,dword ptr [ebp-8]
call FPC_ANSISTR_DECR_REF
mov dword ptr [ebp-8],0
mov edi,offset _$TEST$_Ld1
lea eax,dword ptr [ebp-8]
call FPC_ANSISTR_DECR_REF
mov dword ptr [ebp-8],edi
mov eax,dword ptr [ebp-8]
call P$TEST_BKDRHASH$ANSISTRING$$LONGWORD
and eax,2147483647
mov dword ptr [ebp-4],eax
lea eax,dword ptr [ebp-8]
call FPC_ANSISTR_DECR_REF
mov dword ptr [ebp-8],0
mov edi,offset _$TEST$_Ld3
lea eax,dword ptr [ebp-8]
call FPC_ANSISTR_DECR_REF
mov dword ptr [ebp-8],edi
mov eax,dword ptr [ebp-8]
call P$TEST_BKDRHASH$ANSISTRING$$LONGWORD
and eax,2147483647
;; И так 6 раз
mov dword ptr [ebp-4],eax
cmp esi,50000000
jl @@j33
Т.е. у компилятора едет крыша и он начинает зачем-то генерить по 2 DecRef'а на каждую итерацию цикла. А DecRef - очень медленная операция.
Вообще хочу сказать, что, IMHO, string'и и inline - вещи несовместимые. Вы должны очень хорошо понимать, как работа со строками влияет на кодогенерацию, прежде чем пытаться начать что-то оптимизировать.