Deimos,
позволите поинтересоваться, на чем основано ваше мнение?
Вы провели сравнительные замеры производительности и/или посчитали такты в ассемблерном листинге?
У вас было еще какое-то обоснование, которое по непонятным причинам не было приведено?
Добавлено спустя 23 минуты 57 секунд:Кстати, код, генерируемый 2.6.4 для b:=s[1] in ['0'..'9'], ничего общего с проверкой на принадлежность множеству не имеет, временное множество не конструируется, код действительно эффективнее 2-го случая:
- Код: Выделить всё
; [5] b:=s[1] in ['0'..'9'];
movzx eax,byte ptr [U_P$PROGRAM_S+1]
sub eax,48
cmp eax,10
jb @@j5
@@j5:
setc byte ptr [U_P$PROGRAM_B]
сравните с:
- Код: Выделить всё
; [6] b:=(s[1]>='0') and (s[1]<='9');
mov al,byte ptr [U_P$PROGRAM_S+1]
cmp al,48
jae @@j8
jmp @@j7
@@j8:
mov al,byte ptr [U_P$PROGRAM_S+1]
cmp al,57
jbe @@j6
jmp @@j7
@@j6:
mov byte ptr [U_P$PROGRAM_B],1
jmp @@j9
@@j7:
mov byte ptr [U_P$PROGRAM_B],0
@@j9:
С ключом -O1 ситуация улучшается:
- Код: Выделить всё
; [6] b:=(s[1]>='0') and (s[1]<='9');
mov al,byte ptr [U_P$PROGRAM_S+1]
cmp al,48
jnae @@j7
mov al,byte ptr [U_P$PROGRAM_S+1]
cmp al,57
jnbe @@j7
mov byte ptr [U_P$PROGRAM_B],1
jmp @@j9
@@j7:
mov byte ptr [U_P$PROGRAM_B],0
@@j9:
С -O2 или -O3 всё ещё лучше:
- Код: Выделить всё
; Var b located in register al
; [6] b:=(s[1]>='0') and (s[1]<='9');
cmp al,48
jnae @@j7
cmp al,57
jnbe @@j7
mov al,1
jmp @@j11
@@j7:
mov al,0
@@j11: