Автор Тема: Blur на разных ЯП.  (Прочитано 48386 раз)

akron1

  • Jr. Member
  • **
  • Сообщений: 76
    • Просмотр профиля
Re: Blur на разных ЯП.
« Ответ #90 : Май 04, 2013, 06:36:23 pm »
Например:

WHILE func() DO
(* пустой оператор *)
END

Где func -- функция с побочным эффектом, например читает данные из файла, выполняет их обработку и возвращает FALSE, если достигнут конец файла.

Berserker

  • Sr. Member
  • ****
  • Сообщений: 254
    • Просмотр профиля
Re: Blur на разных ЯП.
« Ответ #91 : Май 04, 2013, 07:17:25 pm »
Такие вещи можно и в одну строку оформлять на мой взгляд.
WHILE ProcessNextFile() DO END; (* Обработали файлы *)
В руководстве от Гугла по С++, если не ошибаюсь, разрешают и так:
while (ProcessNextFile()) {}

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Blur на разных ЯП.
« Ответ #92 : Май 04, 2013, 09:20:53 pm »
statement = [assignment | ProcedureCall | IfStatement | CaseStatement |
WhileStatement | RepeatStatement | ForStatement].
...
StatementSequence = statement {";" statement}.

Из этого следует, что statement может быть пустым, значит лишние ";" не являются ошибкой, они просто необязательны.

Не, не вижу - где может быть пустой statement?

akron1

  • Jr. Member
  • **
  • Сообщений: 76
    • Просмотр профиля
Re: Blur на разных ЯП.
« Ответ #93 : Май 04, 2013, 09:34:49 pm »
Не, не вижу - где может быть пустой statement?

statement = [assignment | ProcedureCall | IfStatement | CaseStatement |
WhileStatement | RepeatStatement | ForStatement].


Квадратные скобки видишь?))

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Blur на разных ЯП.
« Ответ #94 : Май 04, 2013, 11:36:36 pm »
Квадратные скобки видишь?))

Спасибо! :)

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Blur на разных ЯП.
« Ответ #95 : Май 05, 2013, 04:50:26 am »
Если не затруднит, поясните пожалуйста, какой смысл иметь возможность использовать пустой оператор?

У меня была претензия не к пустому оператору, а к отсутствию (обязательному) точки с запятой перед END. akron1 указал на возможность пустого statement в грамматике (я этот момент упустил), так что опциональная точка с запятой допустима. Претензия снята, был не прав.

trurl

  • Full Member
  • ***
  • Сообщений: 133
    • Просмотр профиля
Re: Blur на разных ЯП.
« Ответ #96 : Май 07, 2013, 08:51:28 am »
Поигрался в оптимизацию на BB.
Исходный вариант с Blur2DArray: 0.77 fps.
Переход к 3D (ARRAY W, H, 3 OF BYTE): 0.73 fps, зато обнаружились ошибки (пропущено +color).
DIV 4 вместо *0.25 : 1.4 fps.
Раскрутка цикла по color : 2.09 fps. (по идее здесь устраняются и проверки последнего индекса)
Выравнивание данных (ARRAY W, H, 4 OF BYTE): 2.48 fps.
Статический массив вместо динамического: 2.65 fps.
Отключение проверок: 2.73 fps.
Здесь фантазия иссякла.
Без выравнивания, но с отключеными проверками дает 2.54 fps, что чуть лучше, чем tcc (2.22 fps).

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Blur на разных ЯП.
« Ответ #97 : Май 07, 2013, 09:29:32 am »
Поигрался в оптимизацию на BB.
Исходный вариант с Blur2DArray: 0.77 fps.
Переход к 3D (ARRAY W, H, 3 OF BYTE): 0.73 fps, зато обнаружились ошибки (пропущено +color).
DIV 4 вместо *0.25 : 1.4 fps.
Раскрутка цикла по color : 2.09 fps. (по идее здесь устраняются и проверки последнего индекса)
Выравнивание данных (ARRAY W, H, 4 OF BYTE): 2.48 fps.
Статический массив вместо динамического: 2.65 fps.
Отключение проверок: 2.73 fps.
Здесь фантазия иссякла.
Без выравнивания, но с отключеными проверками дает 2.54 fps, что чуть лучше, чем tcc (2.22 fps).
Исходники от экспериментов остались? Было бы полезно из выложить - чтобы другим велосипед не изобретать.
Y = λf.(λx.f (x x)) (λx.f (x x))

trurl

  • Full Member
  • ***
  • Сообщений: 133
    • Просмотр профиля
Re: Blur на разных ЯП.
« Ответ #98 : Май 07, 2013, 10:07:44 am »
Здесь фантазия иссякла.
Семен Семеныч! Там же индексы в "неправильном" порядке!
Итого 3.5 fps или 4.7 fps с отключенными проверками.
MODULE TestBlur;
  IMPORT Kernel, Out:=StdLog;

  CONST
    W = 640;
    H = 480;
    N = 13;
    Frames = 100;

    RED = 0; GREEN=1; BLUE=2;

  TYPE
    Plane = ARRAY  H, W, 4 OF BYTE;
   
  VAR 
    a, b : Plane;

  PROCEDURE Blur*;
  VAR
    time1,time2 : LONGINT;     fps:REAL;
    f, n : INTEGER;
    x, y : INTEGER;
    color : INTEGER;
  BEGIN
    time1 := Kernel.Time();

    FOR f:=1 TO Frames DO
      FOR n:=1 TO N DO

        FOR y:= 1 TO H-2 DO
          FOR x:= 1 TO W-2 DO
              b[y,x][RED] := SHORT(SHORT((a[y,x + 1][RED] + a[y,x - 1][RED] + a[y - 1, x][RED] + a[y + 1, x][RED]) DIV 4));
              b[y,x][GREEN] := SHORT(SHORT((a[y,x + 1][GREEN] + a[y,x - 1][GREEN] + a[y - 1, x][GREEN] + a[y + 1, x][GREEN]) DIV 4));
              b[y,x][BLUE] := SHORT(SHORT((a[y,x + 1][BLUE] + a[y,x - 1][BLUE] + a[y - 1, x][BLUE] + a[y + 1, x][BLUE]) DIV 4));
          END
        END;

        FOR y:=1 TO H-2 DO
          FOR x:=1 TO W-2 DO
              a[y,x][RED] := SHORT(SHORT((b[y,x + 1][RED] + b[y,x - 1][RED] + b[y - 1, x][RED] + b[y + 1, x][RED]) DIV 4));
              a[y,x][GREEN] := SHORT(SHORT((b[y,x + 1][GREEN] + b[y,x - 1][GREEN] + b[y - 1, x][GREEN] + b[y + 1, x][GREEN]) DIV 4));
              a[y,x][BLUE] := SHORT(SHORT((b[y,x + 1][BLUE] + b[y,x - 1][BLUE] + b[y - 1, x][BLUE] + b[y + 1, x][BLUE]) DIV 4));
          END
        END

      END
    END;
    time2 := Kernel.Time();
    fps:=Frames*1000/(time2 - time1);
    Out.String("t="); Out.Real((time2 - time1)/1000);
    Out.String(" fps="); Out.Real(fps);
    Out.Ln;
  END Blur;

END TestBlur.

DevCompiler.CompileThis TestBlur!!
TestBlur.Blur

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Blur на разных ЯП.
« Ответ #99 : Май 07, 2013, 10:45:16 am »
Здесь фантазия иссякла.
Семен Семеныч! Там же индексы в "неправильном" порядке!
Итого 3.5 fps или 4.7 fps с отключенными проверками.
MODULE TestBlur;
  IMPORT Kernel, Out:=StdLog;

  CONST
    W = 640;
    H = 480;
    N = 13;
    Frames = 100;

    RED = 0; GREEN=1; BLUE=2;

  TYPE
    Plane = ARRAY  H, W, 4 OF BYTE;
   
  VAR 
    a, b : Plane;

  PROCEDURE Blur*;
  VAR
    time1,time2 : LONGINT;     fps:REAL;
    f, n : INTEGER;
    x, y : INTEGER;
    color : INTEGER;
  BEGIN
    time1 := Kernel.Time();

    FOR f:=1 TO Frames DO
      FOR n:=1 TO N DO

        FOR y:= 1 TO H-2 DO
          FOR x:= 1 TO W-2 DO
              b[y,x][RED] := SHORT(SHORT((a[y,x + 1][RED] + a[y,x - 1][RED] + a[y - 1, x][RED] + a[y + 1, x][RED]) DIV 4));
              b[y,x][GREEN] := SHORT(SHORT((a[y,x + 1][GREEN] + a[y,x - 1][GREEN] + a[y - 1, x][GREEN] + a[y + 1, x][GREEN]) DIV 4));
              b[y,x][BLUE] := SHORT(SHORT((a[y,x + 1][BLUE] + a[y,x - 1][BLUE] + a[y - 1, x][BLUE] + a[y + 1, x][BLUE]) DIV 4));
          END
        END;

        FOR y:=1 TO H-2 DO
          FOR x:=1 TO W-2 DO
              a[y,x][RED] := SHORT(SHORT((b[y,x + 1][RED] + b[y,x - 1][RED] + b[y - 1, x][RED] + b[y + 1, x][RED]) DIV 4));
              a[y,x][GREEN] := SHORT(SHORT((b[y,x + 1][GREEN] + b[y,x - 1][GREEN] + b[y - 1, x][GREEN] + b[y + 1, x][GREEN]) DIV 4));
              a[y,x][BLUE] := SHORT(SHORT((b[y,x + 1][BLUE] + b[y,x - 1][BLUE] + b[y - 1, x][BLUE] + b[y + 1, x][BLUE]) DIV 4));
          END
        END

      END
    END;
    time2 := Kernel.Time();
    fps:=Frames*1000/(time2 - time1);
    Out.String("t="); Out.Real((time2 - time1)/1000);
    Out.String(" fps="); Out.Real(fps);
    Out.Ln;
  END Blur;

END TestBlur.

DevCompiler.CompileThis TestBlur!!
TestBlur.Blur

Прогнал этот вариант на оном референсном ультрабуке (компилировал обычным образом, то есть видимо проверка индексов есть):
BB/CB (trurl):
   time: t= 261
   fps :  3.83
BB/CB (DIV-оптимизация, 2D array - предыдущий вариант):
   time: 303 seconds
   fps : 3.30

Ну, то есть быстрее, но не значительно.

А как отключить проверку индексов?
Y = λf.(λx.f (x x)) (λx.f (x x))

trurl

  • Full Member
  • ***
  • Сообщений: 133
    • Просмотр профиля
Re: Blur на разных ЯП.
« Ответ #100 : Май 07, 2013, 10:50:41 am »
Догнал до 7 fps.
MODULE TestBlur2;
  IMPORT Kernel, Out:=StdLog;

  CONST
    W = 640;
    H = 480;
    N = 13;
    Frames = 100;

    RED = 0; GREEN = 1; BLUE = 2;

  TYPE
    Plane = ARRAY H*W, 4 OF BYTE;
   
  VAR 
    a, b : Plane;

  PROCEDURE Blur*;
  VAR
    f, n : INTEGER;
    x, y, z : INTEGER;
    time1, time2 : LONGINT;     
    fps:REAL;
  BEGIN
    time1 := Kernel.Time();

    FOR f:=1 TO Frames DO
      FOR n:=1 TO N DO

        FOR y:= 1 TO H-2 DO
          FOR x:= 1 TO W-2 DO
            z:= y*W+x;
            b[z][RED] := SHORT(SHORT((a[z + 1][RED] + a[z - 1][RED] + a[z - W][RED] + a[z + W][RED]) DIV 4));
            b[z][GREEN] := SHORT(SHORT((a[z + 1][GREEN] + a[z - 1][GREEN] + a[z - W][GREEN] + a[z + W][GREEN]) DIV 4));
            b[z][BLUE] := SHORT(SHORT((a[z + 1][BLUE] + a[z - 1][BLUE] + a[z - W][BLUE] + a[z + W][BLUE]) DIV 4));
          END
        END;

        FOR y:=1 TO H-2 DO
          FOR x:=1 TO W-2 DO
            z:= y*W+x;
            a[z][RED] := SHORT(SHORT((b[z + 1][RED] + b[z - 1][RED] + b[z - W][RED] + b[z + W][RED]) DIV 4));
            a[z][GREEN] := SHORT(SHORT((b[z + 1][GREEN] + b[z - 1][GREEN] + b[z - W][GREEN] + b[z + W][GREEN]) DIV 4));
            a[z][BLUE] := SHORT(SHORT((b[z + 1][BLUE] + b[z - 1][BLUE] + b[z - W][BLUE] + b[z + W][BLUE]) DIV 4));
          END
        END

      END
    END;
    time2 := Kernel.Time();
    fps:=Frames*1000/(time2 - time1);
    Out.String("t="); Out.Real((time2 - time1)/1000);
    Out.String(" fps="); Out.Real(fps);
    Out.Ln;
  END Blur;

END TestBlur2.

trurl

  • Full Member
  • ***
  • Сообщений: 133
    • Просмотр профиля
Re: Blur на разных ЯП.
« Ответ #101 : Май 07, 2013, 10:52:43 am »

А как отключить проверку индексов?
Там команда для компиляции: (!) DevCompiler.CompileThis TestBlur!!

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Blur на разных ЯП.
« Ответ #102 : Май 07, 2013, 11:03:35 am »

А как отключить проверку индексов?
Там команда для компиляции: (!) DevCompiler.CompileThis TestBlur!!
Вау! Та же самая версия (не твоя новая 7 fps'ная) собранная вот так, дает такие результаты:
BB/CB (trurl с проверкой индексов):
   time: 261 seconds
   fps :  3.83
BB/CB (trurl без проверки индексов):
   time: 113 seconds
   fps :  8.87
Прирост в 2.5 раза!

Вот она, цена проверки выхода за границы! ;-)
Y = λf.(λx.f (x x)) (λx.f (x x))

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Blur на разных ЯП.
« Ответ #103 : Май 07, 2013, 11:16:16 am »
Догнал до 7 fps.
MODULE TestBlur2;
  IMPORT Kernel, Out:=StdLog;

  CONST
    W = 640;
    H = 480;
    N = 13;
    Frames = 100;

    RED = 0; GREEN = 1; BLUE = 2;

  TYPE
    Plane = ARRAY H*W, 4 OF BYTE;
   
  VAR 
    a, b : Plane;

  PROCEDURE Blur*;
  VAR
    f, n : INTEGER;
    x, y, z : INTEGER;
    time1, time2 : LONGINT;     
    fps:REAL;
  BEGIN
    time1 := Kernel.Time();

    FOR f:=1 TO Frames DO
      FOR n:=1 TO N DO

        FOR y:= 1 TO H-2 DO
          FOR x:= 1 TO W-2 DO
            z:= y*W+x;
            b[z][RED] := SHORT(SHORT((a[z + 1][RED] + a[z - 1][RED] + a[z - W][RED] + a[z + W][RED]) DIV 4));
            b[z][GREEN] := SHORT(SHORT((a[z + 1][GREEN] + a[z - 1][GREEN] + a[z - W][GREEN] + a[z + W][GREEN]) DIV 4));
            b[z][BLUE] := SHORT(SHORT((a[z + 1][BLUE] + a[z - 1][BLUE] + a[z - W][BLUE] + a[z + W][BLUE]) DIV 4));
          END
        END;

        FOR y:=1 TO H-2 DO
          FOR x:=1 TO W-2 DO
            z:= y*W+x;
            a[z][RED] := SHORT(SHORT((b[z + 1][RED] + b[z - 1][RED] + b[z - W][RED] + b[z + W][RED]) DIV 4));
            a[z][GREEN] := SHORT(SHORT((b[z + 1][GREEN] + b[z - 1][GREEN] + b[z - W][GREEN] + b[z + W][GREEN]) DIV 4));
            a[z][BLUE] := SHORT(SHORT((b[z + 1][BLUE] + b[z - 1][BLUE] + b[z - W][BLUE] + b[z + W][BLUE]) DIV 4));
          END
        END

      END
    END;
    time2 := Kernel.Time();
    fps:=Frames*1000/(time2 - time1);
    Out.String("t="); Out.Real((time2 - time1)/1000);
    Out.String(" fps="); Out.Real(fps);
    Out.Ln;
  END Blur;

END TestBlur2.

Эта версия, если отключить проверку индексов, выдает такие результаты (для сравнения, рядом результаты C++ версии):
BB/CP (trurl "7 fps" version, range check off):
   time: 88 seconds
   fps : 11.38
C++:
   time: 66
   fps : 15.15
Y = λf.(λx.f (x x)) (λx.f (x x))

Valery Solovey

  • Hero Member
  • *****
  • Сообщений: 509
    • Просмотр профиля
Re: Blur на разных ЯП.
« Ответ #104 : Май 07, 2013, 01:47:18 pm »
Так а сколько мой вариант на одномерном массиве выдаёт fps? http://oberspace.dyndns.org/index.php/topic,484.msg15894.html#msg15894