Ещё любопытнее, что вот такой код работает чуть дольше:
Код:
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 будут занимать гораздо большее время, чем эти проверки типов, так что падение производительности будет не так заметно...