ilovb писал(а):
Оставлю тут информацию, возможно кому-то пригодится. Если я правильно понял, то разница таки в SSE.
И дело не в векторных операциях, а в количестве используемых регистров.
Другими словами компилятор BB в данном случае выдает более медленный код не потому что он не оптимизирующий,
а потому что не использует доступные ресурсы ЦП (XMM регистры) и делает слишком много обменов с памятью (кэшем).
Это гипотеза, но мне мерещится что BB можно ускорить на типовых числодробильных задачах примерно в 2 раза если научить его использовать xmm регистры. Еще можно ускорить переходом на 64 бита (там еще больше регистров, но по сравнению с 32+xmm эффекта много не будет)
"Количеством используемых регистров" , в лучшую сторону, отличался:
XDS Modula-2/Oberon-2
(
или см. ранее про "Intel C++"
)
P.S.
ilovb писал(а):
Код:
LOOP
w := ops[ip];
b4 := w MOD 0100H;
b3 := w DIV 0100H MOD 0100H;
b2 := w DIV 010000H MOD 0100H;
b1 := w DIV 01000000H MOD 0100H;
CASE b1 OF
|Get: reg[b2].Set(mem[b4]);
|Set: mem[b4].Set(reg[b2]);
|Add: reg[b2].SetReal(reg[b3].Num() + reg[b4].Num());
|Jmp: ip := b4;
|Jgt: IF reg[0].Num() > reg[1].Num() THEN ip := b4 END;
|End: EXIT;
END;
INC(ip);
END;
Пример на Modula-3 :
Код:
TYPE
SymCode = BITS 9 FOR [0..262];
(* symbol code: 0 .. 261
set default: 262 *)
Action = BITS 6 FOR [0..32];
(* error: -1 (not stored in table)
shift: 1 .. 10
accept: 11
reduce: 12 .. 21
shift&accept: 22
shift&reduce: 23 .. 32 *)
StateRef = BITS 5 FOR [0..28];
(* no more: 0
next state: 1..28 *)
S = RECORD
key: SymCode;
action: Action;
next: StateRef;
END;
Код:
WITH p=stack.ptr, a=stack.a, v=symbol.value, l=Rules[action].length DO
CASE action OF
| 12 => VAR w: expr := NIL;
p1:expr:=a[p-1].value.value;
BEGIN self.paren_expr(w, p1); v:=w; END;
. . .
| 20 => VAR w: expr := NIL;
p1:STRING:=a[p].value.value;
BEGIN self.string_expr(w, p1); v:=w; END;
| 21 => VAR w: expr := NIL;
p1:CHAR_RANGE:=a[p].value.value;
BEGIN self.charRange_expr(w, p1); v:=w; END;
ELSE
<* ASSERT FALSE *>
END;
FOR i := p - l + 1 TO p DO a[i].value.value.discard(); END;
DEC(p, l);
curState := a[p].state;
END;
DebugState("popping to state");
symbol.code := Rules[action].returnCode;
skipTokenGets := 2;
Аналог механизма Modula-3 'BITS' есть и в ADA.
На что можно рассчитывать в языках программирования, "участниках гонки для решения конкретной задачи",
из тех "что под рукой", и которые Борис "готов использовать"?