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

akron1

  • Jr. Member
  • **
  • Сообщений: 76
    • Просмотр профиля
Re: Blur на разных ЯП.
« Ответ #30 : Апрель 25, 2013, 06:42:54 pm »
Oberon-2
<*+ MAIN *>

MODULE Blur;

  IMPORT Out;

    CONST

        W = 640; W1 = 640 - 3;
        H = 480; H1 = 480 - 3;
        N = 13;
        Frames = 100;

    TYPE

        INTEGER = LONGINT;
        Plane = ARRAY W*3, H OF SHORTINT;

    VAR

        a, b : Plane;

  PROCEDURE Blur2DArray*;
  VAR
    f, n : INTEGER;
    x, y : INTEGER;
    color : INTEGER;
  BEGIN

    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
            FOR color:=0 TO 2 DO
              b[x*3+color,y] := (a[x*3+color,y+1]+a[x*3+color,y-1]+a[(x-1)*3,y]+a[(x+1)*3,y]) DIV 4;
            END
          END
        END;

        FOR y:=1 TO H-2 DO
          FOR x:=1 TO W-2 DO
            FOR color:=0 TO 2 DO
              a[x*3+color,y] := (b[x*3+color,y+1]+b[x*3+color,y-1]+b[(x-1)*3,y]+b[(x+1)*3,y]) DIV 4;
            END
          END
        END
      END
    END;
  END Blur2DArray;

BEGIN
  Blur2DArray;
  Out.String("Done");
END Blur.

Oberon-07/11
MODULE Blur;

  IMPORT dt := DateTime, In, Out, RTL;

  CONST
    W = 640; W1 = 640 - 3;
    H = 480; H1 = 480 - 3;
    N = 13;
    Frames = 1;

  TYPE
    Plane = ARRAY W*3, H OF CHAR;

  VAR
    a, b:  Plane;
    time: LONGREAL;

  PROCEDURE Blur2DArray*;
  VAR
    f, n : INTEGER;
    x, y : INTEGER;
    color : INTEGER;
  BEGIN
    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
            FOR color:=0 TO 2 DO
              b[x*3+color,y] := CHR((ORD(a[x*3+color,y+1])+ORD(a[x*3+color,y-1])+ORD(a[(x-1)*3,y])+ORD(a[(x+1)*3,y])) DIV 4);
            END
          END
        END;
        FOR y:=1 TO H-2 DO
          FOR x:=1 TO W-2 DO
            FOR color:=0 TO 2 DO
              a[x*3+color,y] := CHR((ORD(b[x*3+color,y+1])+ORD(b[x*3+color,y-1])+ORD(b[(x-1)*3,y])+ORD(b[(x+1)*3,y])) DIV 4);
            END
          END
        END
      END
    END;
  END Blur2DArray;

BEGIN
  In.Open;
  Out.Open;
  time := dt.Now();
  Blur2DArray;
  Out.FixReal(LONG(FLT(Frames))/((dt.Now() - time) * 86400.D0), 20, 5);
  In.Ln;
END Blur.

Oberon-07M
MODULE Blur;

  IMPORT c := Console;

  CONST
    W = 640; W1 = 640 - 3;
    H = 480; H1 = 480 - 3;
    N = 13;
    Frames = 10;

  TYPE
    Plane = ARRAY W*3, H OF CHAR;

  VAR
    a, b : Plane;
    time : INTEGER;

  PROCEDURE ["Kernel32.dll", "GetTickCount", 0] GetTickCount(): INTEGER;

  PROCEDURE Blur2DArray*;
  VAR
    f, n : INTEGER;
    x, y : INTEGER;
    color : INTEGER;
  BEGIN
    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
            FOR color:=0 TO 2 DO
              b[x*3+color,y] := CHR((ORD(a[x*3+color,y+1])+ORD(a[x*3+color,y-1])+ORD(a[(x-1)*3,y])+ORD(a[(x+1)*3,y])) DIV 4);
            END
          END
        END;
        FOR y:=1 TO H-2 DO
          FOR x:=1 TO W-2 DO
            FOR color:=0 TO 2 DO
              a[x*3+color,y] := CHR((ORD(b[x*3+color,y+1])+ORD(b[x*3+color,y-1])+ORD(b[(x-1)*3,y])+ORD(b[(x+1)*3,y])) DIV 4);
            END
          END
        END
      END
    END;
  END Blur2DArray;

BEGIN
  time := GetTickCount();
  Blur2DArray;
  time := GetTickCount() - time;
  c.Int(time); c.Ln;
END Blur.

Dephi
program Blur;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  Windows;

CONST
  W = 640; W1 = 640 - 3;
  H = 480; H1 = 480 - 3;
  NN = 13;
  Frames = 10;

TYPE
  Plane = ARRAY [0..W*3-1, 0..H-1] OF BYTE;

VAR
  a, b : Plane;

  PROCEDURE Blur2DArray;
  VAR
      f, n : INTEGER;
      x, y : INTEGER;
      color : INTEGER;
      i: INTEGER;
  BEGIN
    FOR f:=1 TO Frames DO BEGIN
      FOR n:=1 TO NN DO BEGIN
        FOR y:=1 TO H-2 DO BEGIN
          FOR x:=1 TO W-2 DO BEGIN
            FOR color:=0 TO 2 DO BEGIN
              b[x*3+color,y] := (a[x*3+color,y+1]+a[x*3+color,y-1]+a[(x-1)*3,y]+a[(x+1)*3,y]) DIV 4;
            END
          END
        END;
        FOR y:=1 TO H-2 DO BEGIN
          FOR x:=1 TO W-2 DO BEGIN
            FOR color:=0 TO 2 DO BEGIN
              a[x*3+color,y] := (b[x*3+color,y+1]+b[x*3+color,y-1]+b[(x-1)*3,y]+b[(x+1)*3,y]) DIV 4;
            END
          END
        END
      END
    END;
  END;

var t: Cardinal;
begin
  try
    t := GetTickCount;
    Blur2DArray;
    t := GetTickCount - t;
    Write((Frames/t*1000):20:5);
    Readln;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Blur на разных ЯП.
« Ответ #31 : Апрель 25, 2013, 06:46:46 pm »
Oberon-2
...
Oberon-07/11
...
Oberon-07M
...
Delphi
Спасибо, буду гонять (хотя до Delphi скорее всего не доберусь).
Y = λf.(λx.f (x x)) (λx.f (x x))

Valery Solovey

  • Hero Member
  • *****
  • Сообщений: 509
    • Просмотр профиля
Re: Blur на разных ЯП.
« Ответ #32 : Апрель 25, 2013, 07:20:30 pm »
Ну так как, дала моя ручная оптимизация какой-нибудь результат?

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Blur на разных ЯП.
« Ответ #33 : Апрель 25, 2013, 07:25:12 pm »
Ну так как, дала моя ручная оптимизация какой-нибудь результат?
Не добрался еще, но помню что надо добраться :-)
Y = λf.(λx.f (x x)) (λx.f (x x))

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Blur на разных ЯП.
« Ответ #34 : Апрель 25, 2013, 09:27:15 pm »
Win7 32 bit, Pentium DualCore 2.6 GHz
GNAT 2012 15.5 fps
TinyCC 3.77 fps
VC2012 20.8 fps
Rust 0.6 10.6 fps

Код на Rust'е -- первый раз на нём пишу, хз что надо тут делать, что бы шустро вычислялось...
extern mod std;
use std::time::precise_time_s;

fn index(x: uint, y: uint, color: uint) -> uint {
    (640*y + x)*3 + color
}

fn Blur(inar: &mut [u8], outar: &mut [u8]) {
    for uint::range(1, 480-2) |y| {
        for uint::range(1, 640-2) |x| {
            outar[index(x, y, 0)]= (
                ((inar[index(x, y-1, 0)] as uint) +
                 (inar[index(x, y+1, 0)] as uint) +
                 (inar[index(x-1, y, 0)] as uint) +
                 (inar[index(x+1, y, 0)] as uint)) >> 2) as u8;
            outar[index(x, y, 1)]= (
                ((inar[index(x, y-1, 1)] as uint) +
                 (inar[index(x, y+1, 1)] as uint) +
                 (inar[index(x-1, y, 1)] as uint) +
                 (inar[index(x+1, y, 1)] as uint)) >> 2) as u8;
            outar[index(x, y, 2)]= (
                ((inar[index(x, y-1, 2)] as uint) +
                 (inar[index(x, y+1, 2)] as uint) +
                 (inar[index(x-1, y, 2)] as uint) +
                 (inar[index(x+1, y, 2)] as uint)) >> 2) as u8;
        }
    }
}

fn timeit(f: &fn()) -> float {
    let start = precise_time_s();
    f();
    let stop = precise_time_s();
    stop - start
}

fn main() {
    let blurRange  : uint =  13;
    let frames     : uint = 1000;
    let mut inarr  = [127u8, ..(640*480*3)];
    let mut outarr = [  0u8, ..(640*480*3)];

    let time = do timeit {
        for uint::range(1, frames) |_nn| {
            for uint::range(1, blurRange) |_i| {
                Blur(inarr,  outarr);
                Blur(outarr, inarr);
            }
        } };
   
    io::println(fmt!("blur_rust: fps %? time %? sec", ((frames as float)/time), time));
}
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Blur на разных ЯП.
« Ответ #35 : Апрель 26, 2013, 07:33:01 am »
DIzer, не желаете эйфорию испытать?

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Blur на разных ЯП.
« Ответ #36 : Апрель 26, 2013, 08:26:01 am »
WinXP sp3 Pentium DualCore 1.6 GHz
C# VS2010 .NET 4.0 3.8 fps
F# VS2010 .NET 4.0 10.9 fps

На этом же ПК до этого у меня были такие результаты:

GNAT2012       9.4 fps
TinyC 0.9.24   2.3 fps
VC2010        12.3 fps

Результаты ваще удивительные:
программа на сишарпе в три раза медленнее, чем на С++ (видимо из-за проверок выхода за границы массивов);
однако программа на F# почти догнала сишную (хотя её стоит лучше проверить -- на реальных фотках, а то хз правильно ли она работает)

C#:
using System;

namespace BlurCS
{
    class Program
    {
        const  uint width     = 640,
                    height    = 480,
                    blurRange =  13,
                    frames    =  20;

        static Byte[] inarr   = new Byte[width*height*3],
                      outarr  = new Byte[width*height*3];
       
        enum Color: uint
        {
            RED = 0,
            GREEN,
            BLUE
        }

        static uint index(uint x, uint y, Color color)
        {
            return 3*(width*y + x) + (uint)color;
        }

        static void Blur(ref Byte[] inar, ref Byte[] outar)
        {
            for (uint y=1; y<height-1; y++)
            {
                for (uint x=1; x<width-1; x++)
                {
                    outar[index(x, y, Color.RED)]= (Byte)(
                        ((uint)inar[index(x, y-1, Color.RED)]+
                         (uint)inar[index(x, y+1, Color.RED)]+
                         (uint)inar[index(x-1, y, Color.RED)]+
                         (uint)inar[index(x+1, y, Color.RED)]) >> 2);
                    outar[index(x, y, Color.GREEN)]= (Byte)(
                        ((uint)inar[index(x, y-1, Color.GREEN)]+
                         (uint)inar[index(x, y+1, Color.GREEN)]+
                         (uint)inar[index(x-1, y, Color.GREEN)]+
                         (uint)inar[index(x+1, y, Color.GREEN)]) >> 2);
                    outar[index(x, y, Color.BLUE)]= (Byte)(
                        ((uint)inar[index(x, y-1, Color.BLUE)]+
                         (uint)inar[index(x, y+1, Color.BLUE)]+
                         (uint)inar[index(x-1, y, Color.BLUE)]+
                         (uint)inar[index(x+1, y, Color.BLUE)]) >> 2);
                }
            }
        }

        static void Main(string[] args)
        {
            System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch();
            timer.Reset(); timer.Start();

            for (uint nn=0; nn<frames; nn++)
            {
                for (uint i=0; i<blurRange; i++)
                {
                    Blur(ref inarr,  ref outarr);
                    Blur(ref outarr, ref inarr);
                }
            }

            timer.Stop();
            double dt = timer.Elapsed.TotalSeconds;

            System.Console.WriteLine("BlurC#: FPS = {0:##.##} time = {1:#.#} sec", (frames / dt), dt);
        }
    }
}

F#:
let width    : int = 640
let height   : int = 480
let blurRange: int =  13
let frames   : int = 100

let inarr:  byte array = Array.create     (3*width*height) 127uy
let outarr: byte array = Array.zeroCreate (3*width*height)

let Blur(inar: byte array ref, outar: byte array ref) =
   
    let inline index x y color = 3*(width*y + x) + color

    for y = 1 to height-2 do
        for x = 1 to width-2 do
            Array.set !outar (index x y 0)
                            (byte(
                                (int (!inar).[index   x (y-1) 0] +
                                 int (!inar).[index   x (y+1) 0] +
                                 int (!inar).[index (x-1) y   0] +
                                 int (!inar).[index (x+1) y   0]) / 2))

do  let timer = new System.Diagnostics.Stopwatch()
    timer.Reset(); timer.Start()

    for nn = 1 to frames do
        for i = 1 to blurRange do
            Blur(ref inarr,  ref outarr)
            Blur(ref outarr, ref inarr)

    timer.Stop()
    let dt = timer.Elapsed.TotalSeconds

    System.Console.WriteLine("BlurF#: FPS = {0:##.##} time = {1:#.#} sec", (float frames / dt), dt)
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Blur на разных ЯП.
« Ответ #37 : Апрель 26, 2013, 08:38:19 am »
Результаты ваще удивительные:
программа на сишарпе в три раза медленнее, чем на С++ (видимо из-за проверок выхода за границы массивов);
однако программа на F# почти догнала сишную (хотя её стоит лучше проверить -- на реальных фотках, а то хз правильно ли она работает)

Ларчик просто открывался -- в программе на F# была ошибка -- обрабатывался только 1 цвет )))

WinXP sp3 Pentium DualCore 1.6 GHz
C# VS2010 .NET 4.0 3.8 fps
F# VS2010 .NET 4.0 2.8 fps

На этом же ПК до этого у меня были такие результаты:

GNAT2012       9.4 fps
TinyC 0.9.24   2.3 fps
VC2010        12.3 fps

Исправленный вариант на F#:
let width    : int = 640
let height   : int = 480
let blurRange: int =  13
let frames   : int = 100

let inarr:  byte array = Array.create     (3*width*height) 127uy
let outarr: byte array = Array.zeroCreate (3*width*height)

let Blur(inar: byte array ref, outar: byte array ref) =
   
    let index x y color = 3*(width*y + x) + color

    for y = 1 to height-2 do
        for x = 1 to width-2 do
            for c = 0 to 2 do
                Array.set !outar (index x y c)
                                (byte((int (!inar).[index   x (y-1) c] +
                                       int (!inar).[index   x (y+1) c] +
                                       int (!inar).[index (x-1) y   c] +
                                       int (!inar).[index (x+1) y   c]) / 2))

do  let timer = new System.Diagnostics.Stopwatch()
    timer.Reset(); timer.Start()

    for nn = 1 to frames do
        for i = 1 to blurRange do
            Blur(ref inarr,  ref outarr)
            Blur(ref outarr, ref inarr)

    timer.Stop()
    let dt = timer.Elapsed.TotalSeconds

    System.Console.WriteLine("BlurF#: FPS = {0:##.##} time = {1:#.#} sec", (float frames / dt), dt)
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Blur на разных ЯП.
« Ответ #38 : Апрель 26, 2013, 08:46:32 am »
Какой-то не очень компилятор у F# -- не может развернуть простейший цикл. Развернул вручную -- fps поднялся 22% и составил 3.37 (был 2.8).
Всё же от сишарпа отстаёт на 13%...

F#:let width    : int = 640
let height   : int = 480
let blurRange: int =  13
let frames   : int = 100

let inarr:  byte array = Array.create     (3*width*height) 127uy
let outarr: byte array = Array.zeroCreate (3*width*height)

let Blur(inar: byte array ref, outar: byte array ref) =
   
    let index x y color = 3*(width*y + x) + color

    for y = 1 to height-2 do
        for x = 1 to width-2 do
            Array.set !outar (index x y 0)
                            (byte((int (!inar).[index   x (y-1) 0] +
                                   int (!inar).[index   x (y+1) 0] +
                                   int (!inar).[index (x-1) y   0] +
                                   int (!inar).[index (x+1) y   0]) / 2))
            Array.set !outar (index x y 1)
                            (byte((int (!inar).[index   x (y-1) 1] +
                                   int (!inar).[index   x (y+1) 1] +
                                   int (!inar).[index (x-1) y   1] +
                                   int (!inar).[index (x+1) y   1]) / 2))
            Array.set !outar (index x y 2)
                            (byte((int (!inar).[index   x (y-1) 2] +
                                   int (!inar).[index   x (y+1) 2] +
                                   int (!inar).[index (x-1) y   2] +
                                   int (!inar).[index (x+1) y   2]) / 2))

do  let timer = new System.Diagnostics.Stopwatch()
    timer.Reset(); timer.Start()

    for nn = 1 to frames do
        for i = 1 to blurRange do
            Blur(ref inarr,  ref outarr)
            Blur(ref outarr, ref inarr)

    timer.Stop()
    let dt = timer.Elapsed.TotalSeconds

    System.Console.WriteLine("BlurF#: FPS = {0:##.##} time = {1:#.#} sec", (float frames / dt), dt)
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

Romiras

  • Sr. Member
  • ****
  • Сообщений: 264
    • Просмотр профиля
    • Romiras Dev Lab
Re: Blur на разных ЯП.
« Ответ #39 : Апрель 26, 2013, 09:12:31 am »
Интересно, у кого есть оптимизирующий компилятор OOC, может ли проверить результат кода на Обероне-2?

Romiras

  • Sr. Member
  • ****
  • Сообщений: 264
    • Просмотр профиля
    • Romiras Dev Lab
Re: Blur на разных ЯП.
« Ответ #40 : Апрель 26, 2013, 09:32:00 am »
При замене кода
FOR y:=1 TO H-2 DO
FOR x:=1 TO W-2 DO
FOR color:=0 TO 2 DO
b[x*3+color,y] := SHORT(SHORT((a[x*3+color,y+1]+a[x*3+color,y-1]+a[(x-1)*3,y]+a[(x+1)*3,y]) DIV 4));
END
END
END;
на такой:
FOR y:=1 TO H-2 DO
FOR x:=1 TO W-2 DO
v := x*3; va := a[v - 3,y] + a[v + 3,y];
b[v,y] := SHORT(SHORT(ASH(
a[v,y+1]+
a[v,y-1]+
va
, -2)));
INC(v);
b[v,y] := SHORT(SHORT(ASH(
a[v,y+1]+
a[v,y-1]+
va
, -2)));
INC(v);
b[v,y] := SHORT(SHORT(ASH(
a[v,y+1]+
a[v,y-1]+
va
, -2)));
END
END;
Получаю дополнительное уменьшение времени выполнения почти на 40%.

Только гарантировать верность вычислений подтвердить не могу: на картинке не проверял.

DddIzer

  • Гость
Re: Blur на разных ЯП.
« Ответ #41 : Апрель 26, 2013, 11:55:54 am »
DIzer, не желаете эйфорию испытать?
Не желаю участвовать в коллективном маразме (если состояние эйфории Алексея я еще могу понять, но  лично мне  моча глаза не застилает).. но это ИМХО , конечно...

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Blur на разных ЯП.
« Ответ #42 : Апрель 26, 2013, 12:10:37 pm »
DIzer, не желаете эйфорию испытать?
Не желаю участвовать в коллективном маразме (если состояние эйфории Алексея я еще могу понять, но  лично мне  моча глаза не застилает).. но это ИМХО , конечно...
Ну, предложи другой конкретный алгоритм для бенчмарка. Он должен быть просто и короток в реализации.

Конкретный алгоритм - это значит покажи референсную реализацию его на любом императивном языке.
Y = λf.(λx.f (x x)) (λx.f (x x))

DddIzer

  • Гость
Re: Blur на разных ЯП.
« Ответ #43 : Апрель 26, 2013, 12:28:24 pm »

Ну, предложи другой конкретный алгоритм для бенчмарка. Он должен быть просто и короток в реализации.

Конкретный алгоритм - это значит покажи референсную реализацию его на любом императивном языке.
да любой другой... хоть решето Эратосфена...,или вычисления знаков числа Пи, Дело ведь не в этом..Я гнусно намекаю  на следующее
 ну ладно понравилось ЛИЧНО ВАМ слово Блер (с какого перепоя не мне судить). Захотели вы его реализовать... ну вызвался Сергей в качестве реализатора...
вопрос с какого перепоя Блером называется свертка с ядром ({0,1,0},{1,0,1},{0,1,0})/4 а не  ({1,1,1},{1,0,1},{1,1,1})/8... с какого будуна апликация сверток (повторение свертки N раз) ведет напрямую к увеличению ее радиуса  (по факту ширине окна усреднения). Просто посмотрите на ссылку ( это ведет главным образом к приближению к гауссовскому распределению  (радиальной симметричности), и на картинке видно, что больше N=6 - особого смысла выполнять итерации нет)... короче... не охота быть лошарой ми кантарой...

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Blur на разных ЯП.
« Ответ #44 : Апрель 26, 2013, 12:36:34 pm »
DIzer, не желаете эйфорию испытать?
Не желаю участвовать в коллективном маразме (если состояние эйфории Алексея я еще могу понять, но  лично мне  моча глаза не застилает).. но это ИМХО , конечно...

Не вижу никакого маразма. Лично мне было интересно проверить некоторые моменты сгенерированного машинного кода для одного и того же алгоритма у разных компиляторов интересующих меня языков -- я и проверил. А какой именно там алгоритм -- правильный это блур или не очень -- мне пофигу... :D
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…