Pull to refresh
2
16.1

User

Send message

Занимался переписыванием кода с Delphi на ассемблер для ускорения вычислений. Получал где-то двухкратное ускорение. И наблюдал ускорение вычислений по мере появления новых версий компилятора. Потом был долгий перерыв с Delphi. И теперь поставил Community Edition - скорость работы кода стала примерно равна моим примитивным оптимизациям на ассемблере. Т.е. в новом коде я уже этого делать не буду)


procedure TForm1.DisplayButtonClick(Sender: TObject);
var
  MS: TMemoryStream;
begin

MS:=TMemoryStream.Create;
try

 h[5]:=horiz; h[6]:=vert;
  a:=horiz; if (a and 3<>0) then a:=(a+4) and $FFFFFFFC; h[9]:=a*vert; h[1]:=h[9]+1078;
  //assign(f,'Mandelbrot.bmp'); rewrite(f,1);
  MS.Write(h, 2);
  MS.Write(h[1], 52);
  //blockwrite(f,h,2); blockwrite(f,h[1],52);
  for a:=0 to 254 do
  begin
    pal[a][0]:=round(127+127*cos(2*pi*(a+16)/255)); pal[a][1]:=round(127+127*sin(2*pi*(a+16)/255)); pal[a][2]:=q[a]; pal[a][3]:=0
  end;
  for a:=0 to 2 do pal[255][a]:=255; pal[255][3]:=0;

  //blockwrite(f,pal,1024);
  MS.Write(pal, 1024);
  step:=size/horiz;
  absc2:=absc-step*(horiz-1)/2; ordi2:=ordi-step*(vert-1)/2;
  for b:=0 to vert-1 do
  begin
    n:=ordi2+b*step;
    for a:=0 to horiz-1 do
    begin
      m:=absc2+a*step;
      c:=m; d:=n; t:=4081;
      repeat cc:=c*c; dd:=d*d; d:=(c+c)*d+n; c:=cc-dd+m; dec(t) until (t=0) or (cc+dd>1000000.0);
      if (t=0) then s[a]:=255 else s[a]:=t mod 255;
    end;
    MS.Write(s, h[9] div vert);
    //blockwrite(f,s,h[9] div vert);
    //write('Done: ',b+1,chr(13))
  end;

  MS.Position:=0;
  Image1.Picture.LoadFromStream(MS);
finally
  MS.Free;
end;
  //close(f)
end;

procedure TForm1.ZoomInButtonClick(Sender: TObject);
begin
 size := size-size*0.2;
 DisplayButtonClick(Sender);
end;

Всё же так удобнее оценивать ваши труды. Бросил на форму две кнопки и контейнер для изображений, по клику наблюдаем результат, а не появившийся в папке файл :-)

Если брать существующие целые типы и просто масштабировать значения, типа хранить значения, умноженные на 10000 или на 2^8 или сколько нужно - то разве нельзя обойтись существующими возможностями компилятора? Объявить только отдельный тип чтобы случайно не сложить масштабированное значение с не масштабированным и всё? Тут, конечно, нужно еще понимать для чего всё это делается.

Посмотрел код и вспомнил как в школе программировал. Даже стиль тот же. Тогда был важен только результат. И чтобы работало быстро...

Репозиторий на github не завели? Ну и сделайте GUI-приложение. Раз у вас получается сформировать файл BMP- пишите его в память и загружайте в TImage. А по клику на изображение делайте масштабирование. Или по таймеру.

И будет у вас видео как на YouTube.
Удачи!

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

Перейти в нужное состояние после получения некоторого результата на конкретном шаге - не проблема. Для этого каждый шаг заранее объявляет возможные типы результата выполнения шага, на основании значения которого выбирается следующий шаг.
Если говорить о том, что при этом показывается пользователю, то у нас для процесса есть метод, который транслирует текущее содержимое контекста процесса (вместе с текущим шагом) в ответ, который видит пользователь. Пока мы находимся на некотором промежуточном шаге - мы возвращаем Операция в обработке, когда же мы оказываемся на одном из финальных шагов - то начинает глубже анализировать контекст процесса и сообщаем об успехе или причине ошибки (причина не является шагом, хранится отдельно в контексте, т.к. от нее не зависит топология процесса).

Необычная у вас задача. Посмотрели ваш код, больше похоже на функциональный подход. Если бы там можно было увидеть примеры использования то, возможно, мы бы даже взяли себе какие-то идеи.

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

Это не состояния, это результат некоторого вызова. В какие состояния он приведёт, зависит от того, что мы захотим. Пойдёт в один шаг, в другой или третий.

Information

Rating
407-th
Location
Россия
Registered
Activity