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

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Blur на разных ЯП.
« Ответ #75 : Апрель 26, 2013, 09:00:49 pm »
Реаизовал алгоритм на javaScript'e. Поскольку прямо сейчас под рукой той, референсной машины нет, то все гонял на старом ноутбуке (2008 год, 32 бита. виста).

Результаты (js, и, для сравнения, ББ на этой машине):
js:
   time: 290 seconds
   fps : 3.45
BB/CP (DIV-оптимизация, 2D array):
   time: 454 seconds
   fps : 2.20

BB/CP (DIV-оптимизация, 2D array): ~428 s
LuaJit 2.0.1 (x86): ~197 s

local ffi = require 'ffi'

local W, H = 640, 480
local N, F = 13, 1000

local plane = ffi.typeof("uint8_t[?]")

local a, b = plane(W*H*3), plane(W*H*3)

local function index(x, y, c)
    return (x+y*W)*3 + c
end

local t1 = os.clock()

for f = 1, F do
    for n = 1, N do

        for y = 1, H-2 do
            for x = 1, W-2 do
                for c = 0, 2 do
                    b[index(x, y, c)] = bit.lshift(
                                a[index(x, y+1, c)]+
                                a[index(x, y-1, c)]+
                                a[index(x-1, y, c)]+
                                a[index(x+1, y, c)], 2)
                end
            end
        end

        for y = 1, H-2 do
            for x = 1, W-2 do
                for c = 0, 2 do
                    a[index(x, y, c)] = bit.lshift(
                                b[index(x, y+1, c)]+
                                b[index(x, y-1, c)]+
                                b[index(x-1, y, c)]+
                                b[index(x+1, y, c)], 2)
                end
            end
        end

    end
end

print(os.clock() - t1)

Core i3 M380 2.53GHz
Windows 7 64

fortran

  • Newbie
  • *
  • Сообщений: 1
    • Просмотр профиля
Re: Blur на разных ЯП.
« Ответ #76 : Апрель 26, 2013, 09:02:10 pm »
Версия на Fortran
program blur_bench
  implicit none
 
  integer, parameter :: width = 640, height = 480
  integer, parameter :: frames = 20, r = 13

  type pixel
    byte :: r, g, b
  end type

  integer :: i, j, f, n
  real :: t1, t2
  type(pixel), dimension(width,height) :: in, out
 
  call cpu_time(t1)

  do f = 1,frames
    do n = 1,r
      do j = 2,height-1
        do i = 2,width-1
          out(i,j)%r = (in(i-1,j)%r + in(i+1,j)%r + in(i,j-1)%r + in(i,j+1)%r) / 4
          out(i,j)%g = (in(i-1,j)%g + in(i+1,j)%g + in(i,j-1)%g + in(i,j+1)%g) / 4
          out(i,j)%b = (in(i-1,j)%b + in(i+1,j)%b + in(i,j-1)%b + in(i,j+1)%b) / 4
        end do
      end do
      do j = 2,height-1
        do i = 2,width-1
          in(i,j)%r = (out(i-1,j)%r + out(i+1,j)%r + out(i,j-1)%r + out(i,j+1)%r) / 4
          in(i,j)%g = (out(i-1,j)%g + out(i+1,j)%g + out(i,j-1)%g + out(i,j+1)%g) / 4
          in(i,j)%b = (out(i-1,j)%b + out(i+1,j)%b + out(i,j-1)%b + out(i,j+1)%b) / 4
        end do
      end do
    end do
  end do
 
  call cpu_time(t2)
  write (*,*) 'Time: ', t2-t1
  write (*,*) 'FPS: ', frames/(t2-t1)

end program

Valery Solovey

  • Hero Member
  • *****
  • Сообщений: 509
    • Просмотр профиля
Re: Blur на разных ЯП.
« Ответ #77 : Апрель 26, 2013, 09:34:42 pm »
Варианта на жабе не было?

через for-ы где-то на полсекунды быстрее работает, чем через while. Но всё равно где-то на 10 сек. медленнее ББ.
Проверял на десктопе, из IDE, без каких-либо ключей. жаба 7.

import java.io.IOException;
import java.io.InputStream;

public class TestBlur {

    private static int W = 640;
    private static int H = 480;

    private static int line = 1;
    private static int colour = 3;

    private static int w = (W - 1) * colour;
    private static int h = H - 1;

    private static int w2 = W + colour;
    private static int shift = 2;

    private static int F = 1000;

    private static void Do(int N) {
        long time = System.currentTimeMillis();
        int len = W * H * colour;
        byte a1[] = new byte[len];
        byte a2[] = new byte[len];
        int m;

        for (int f = 0; f < F; f++) {
            for (int n = 0; n < N; n++) {
                m = w + 6;
                for (int y = 1; y < h; y++) {
                    for (int x = 3; x < w; x++) {
                        a2[m] = (byte) ((a1[m - w2] + a1[m - colour] + a1[m + colour] + a1[m + w2] ) >> shift);
                        m++;
                    }
                    m = m + 6;
                }

                m = w + 6;
                for (int y = 1; y < h; y++) {
                    for (int x = 3; x < w; x++) {
                        a1[m] = (byte) ((a2[m - w2] + a2[m - colour] + a2[m + colour] + a2[m + w2] ) >> shift);
                        m++;
                    }
                    m = m + 6;
                }
            }
        }
        System.out.println(System.currentTimeMillis() - time);
    }

    private static void Do2(int N) {
        long time = System.currentTimeMillis();
        int len = W * H * colour;
        byte a1[] = new byte[len];
        byte a2[] = new byte[len];
        int m;

        int f, n;
        int x, y;

        f = 0;
        while (f < F) {
            n = 0;
            while (n < N) {
                m = w + 6;
                y = 1;
                while (y < h) {
                    x = 3;
                    while (x < w) {
                        a2[m] = (byte) ((a1[m - w2] + a1[m - colour] + a1[m + colour] + a1[m + w2] ) >> shift);
                        m++;
                        x++;
                    }
                    m = m + 6;
                    y++;
                }

                m = w + 6;
                y = 1;
                while (y < h) {
                    x = 3;
                    while (x < w) {
                        a1[m] = (byte) ((a2[m - w2] + a2[m - colour] + a2[m + colour] + a2[m + w2] ) >> shift);
                        m++;
                        x++;
                    }
                    m = m + 6;
                    y++;
                }

                n++;
            }
            f++;
        }
        System.out.println(System.currentTimeMillis() - time);
    }

    public static void main(String argv[]) {
        char ch = 'd';
        InputStream is = System.in;
        while (ch != 'q' || ch == 'Q') {
            System.out.print("Start test [1,2], [Q]uit > ");
            try {
                ch = (char) is.read();
                if (ch == '1') {
                    Do(13);
                } else if (ch == '2') {
                    Do2(13);
                }
            } catch (IOException e) {
                System.err.println("error: " + e.getMessage());
            }
        }
    }
}

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Blur на разных ЯП.
« Ответ #78 : Апрель 26, 2013, 09:45:00 pm »
...
Блин, перепутал.
rshift должен быть

Valery Solovey

  • Hero Member
  • *****
  • Сообщений: 509
    • Просмотр профиля
Re: Blur на разных ЯП.
« Ответ #79 : Апрель 27, 2013, 01:18:14 am »
Сделал версию на Лимбе, но что-то оно медленно работает...
То ли там особый подход нужен, то ли эмулятор там слабенький.
Для N=13 работало дольше 1:20. Правда, через полчаса после запуска меня заколебало, и я начал просмотр фильма. Возможно, это в некоторой степени повлияло на результат.

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Blur на разных ЯП.
« Ответ #80 : Апрель 27, 2013, 04:44:44 am »
В Блэкбоксе же ASH есть нормально работающий

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Blur на разных ЯП.
« Ответ #81 : Апрель 27, 2013, 10:36:26 am »
Глянул исходники компилятора Блэкбокса - DIV в нужных местах заменяется на математические сдвиги

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Blur на разных ЯП.
« Ответ #82 : Апрель 27, 2013, 10:39:51 am »
то бишь на арифметические

Valery Solovey

  • Hero Member
  • *****
  • Сообщений: 509
    • Просмотр профиля
Re: Blur на разных ЯП.
« Ответ #83 : Апрель 27, 2013, 12:11:41 pm »
Байт бывает отрицательным.
Цитировать
Глянул исходники компилятора Блэкбокса
А в каком именно модуле ББ это находится?

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Blur на разных ЯП.
« Ответ #84 : Апрель 27, 2013, 12:23:01 pm »
Байт бывает отрицательным.
Цитировать
Глянул исходники компилятора Блэкбокса
А в каком именно модуле ББ это находится?
CPB

Valery Solovey

  • Hero Member
  • *****
  • Сообщений: 509
    • Просмотр профиля
Re: Blur на разных ЯП.
« Ответ #85 : Апрель 27, 2013, 12:55:11 pm »
Да, спасибо. Я уже тоже нашёл.

Valery Solovey

  • Hero Member
  • *****
  • Сообщений: 509
    • Просмотр профиля
Re: Blur на разных ЯП.
« Ответ #86 : Май 03, 2013, 04:34:52 pm »
Так какие же результаты запусков программ на эталонной машине?

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Blur на разных ЯП.
« Ответ #87 : Май 04, 2013, 05:04:21 pm »
Oberon-07/11

Кстати, к вопросу о совместимости разных реализаций. Приведенный пример не соответствует репорту языка синтаксически - пресловутые "лишние" точки с запятой. Могу долго рассказывать, что я об этом думаю... но не буду. Просто замечу.

akron1

  • Jr. Member
  • **
  • Сообщений: 76
    • Просмотр профиля
Re: Blur на разных ЯП.
« Ответ #88 : Май 04, 2013, 05:27:33 pm »
Oberon-07/11

Кстати, к вопросу о совместимости разных реализаций. Приведенный пример не соответствует репорту языка синтаксически - пресловутые "лишние" точки с запятой. Могу долго рассказывать, что я об этом думаю... но не буду. Просто замечу.

Цитата из репорта:

statement = [assignment | ProcedureCall | IfStatement | CaseStatement |
WhileStatement | RepeatStatement | ForStatement].
...
StatementSequence = statement {";" statement}.

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

Berserker

  • Sr. Member
  • ****
  • Сообщений: 254
    • Просмотр профиля
Re: Blur на разных ЯП.
« Ответ #89 : Май 04, 2013, 06:19:36 pm »
Цитировать
Могу долго рассказывать, что я об этом думаю... но не буду.
Если не затруднит, поясните пожалуйста, какой смысл иметь возможность использовать пустой оператор?