Ещё любопытнее, что вот такой код работает чуть дольше:
Код:
MODULE TestCase;
PROCEDURE handle (x: INTEGER); END handle;
PROCEDURE handle1(x: INTEGER); END handle1;
PROCEDURE handle2(x: INTEGER); END handle2;
PROCEDURE handle3(x: INTEGER); END handle3;
PROCEDURE test(x: INTEGER);
BEGIN
CASE x OF
| 3: handle3(x);
| 2: handle2(x);
| 1: handle1(x);
ELSE handle (x);
END
END test;
PROCEDURE Do*();
VAR
i: INTEGER;
BEGIN
FOR i := 0 TO 100000000 DO
test(0);
test(1);
test(2);
test(3);
END
END Do;
END TestCase.
Ваш тест у меня (Celeron 1.7) работает 6.25 сек, этот мой тест -- 7.0 сек, а на сам цикл уходит 0.25 сек...
Похоже WITH сделан очень даже неплохо, CASE и то хуже... :о) Что бы это значило? :о))
Переписал этот код на Си:
Код:
void handle (int x) { }
void handle1(int x) { }
void handle2(int x) { }
void handle3(int x) { }
void test(int x)
{
switch(x)
{
case 3: handle3(x); break;
case 2: handle2(x); break;
case 1: handle1(x); break;
default: handle (x); break;
}
}
void main(void)
{
int i;
for (i = 0; i < 100000000; i++)
{
test(0);
test(1);
test(2);
test(3);
}
}
Скомпилировал простейшим компилятором TinyCC, который генерирует весьма посредственный код, зато компилирует сверхбыстро, так время работы программы -- те же 7 сек. То есть Блэкбоксовый компилятор генерирует примерно такой же код, что и посредственный компилятор С... :о)
А вот GCC обошёлся круто -- 0.125 сек. Видимо, он там всё повыбрасывал, что мог... :о)
Vlad писал(а):
Вывод: решения на основе "oberon message bus" с использованием dynamic_cast в C++ действительно могут оказаться неэффективными с точки зрения производительности. Разница в скорости динамической проверки типа порядка 20 раз.
Это спорное утверждение. В реальных программах все эти handlex будут занимать гораздо большее время, чем эти проверки типов, так что падение производительности будет не так заметно...