Правим код написанный ИИ . (Промты, тренинг, оптимизация)

Обсуждаются как существующие проекты (перевод документации, информационная система и т.п.), так и создание новых.

Модератор: Модераторы

Re: Правим код написанный ИИ . (Промты, тренинг, оптимизация

Сообщение Alex2013 » 30.01.2025 16:03:59

Seenkao писал(а):это не ускорение. Это загрузка последовательная загрузка данных и пока одно загрузилось, другое (которое загружено) уже распаковывается и выводится.

Разумеется, одновременное чтение нескольких секторов физического диска невозможно, но есть нюанс: любое чтение с диска кэшируется, а драйвер обслуживания и функции ФС вполне реитерабельны. Так что ускорение есть, но не физическое, а «логическое» (последовательное чтение, кроме самого чтения, приходит длинную цепочку проверок транзакций и вычислений, которые можно успешно распараллелить).

Но, разумеется, кроме «логического ускорения» ФС есть и ускорение от параллельной обработки данных в программе (декодирование JPG и масштабирование любят кушать время). Однако особенно интересно «дикое ускорение» по «оптимизированному» варианту Load 2. Там большая часть загрузки идет «в темную», и списать всё на ускорение вывода не получится.
Зы
Кстати, есть идея! :idea: Вначале читать всё в массив TMemoryStream и только потом раскодировать, масштабировать и т. п.
(По идее, ускорение будет еще выше, а стабильность повысится за счет разделения операций... Хм, интересно, а можно ли из потока запустить другой (вторичный) поток?)
Seenkao писал(а):Надо загрузить данные и сразу отправлять их обрабатываться. Пока обрабатываются пришедшие данные, надо сразу грузить следующие, чтоб не ждать окончания обработки. В этом случае многопоточность немного выигрывает перед однопотоком, потому что позволяет так делать.

Вот и я о том же подумал... Правда, тут есть один «подводный камень»: данные могут понадобиться не все, а только частично (еще не БД, но уже некая структура), в этом случае обработку и загрузку придется как-то совмещать.
Добавлено спустя 20 минут 5 секунд:
Re: Правим код написанный ИИ . (Промты, тренинг, оптимизация)
Seenkao писал(а):Если говорить про интернет, то там примерно так же всё происходит, только узкое горлышко - это пропускная способность твоего интернета.

Это разумеется верно но опять-же любой нормальный сервер умеет обрабатывать запросы параллельно так что время получения ответа на псевдо одновременные запросы будет заметно меньше последовательной загрузки.
Alex2013
долгожитель
 
Сообщения: 3117
Зарегистрирован: 03.04.2013 11:59:44

Re: Правим код написанный ИИ . (Промты, тренинг, оптимизация

Сообщение Alex2013 » 11.02.2025 20:33:48

Добрался до DeepSeek R1 "малый локальный" красиво разглагольствует но код писать почти не умеет ... большой онлайновый "разглагольствует кодом"(добавляет "обвязку" ) ничего особого, но код вроде рабочий выдаёт .
Alex2013
долгожитель
 
Сообщения: 3117
Зарегистрирован: 03.04.2013 11:59:44

Re: Правим код написанный ИИ . (Промты, тренинг, оптимизация

Сообщение Alexander » 06.03.2025 09:23:12

Вот реальный код, который ИИ не осилил сам сделать полностью работоспособным. Озадачивал его сделать реализацию syscall clone на FreePascal'е.
Использовались последовательно онлайн deepseek и chatgpt. Такой код запускается, но изредка частично работает, а чаще падает. А почему - ИИ понять не может.

Код: Выделить всё
unit syscloneunit;

{$mode objfpc}{$H+}

interface

uses
  sysutils, ctypes, unix, baseunix,syscall;

type
  TThreadFunc = function(Arg: Pointer): PtrInt; cdecl;

  TSysClone = class
  private
    FThreadFunc: TThreadFunc;
    FArg: Pointer;
    FThreadID: TPid;
    FStack: Pointer;
    FStackSize: csize_t;
    function CreateStack: Boolean;
    procedure FreeStack;
  public
    constructor Create(ThreadFunc: TThreadFunc; Arg: Pointer; StackSize: csize_t = 1024 * 1024);
    destructor Destroy; override;
    function Start: Boolean;
    function Join: PtrInt;
  end;

implementation

const
  CLONE_VM       = $00000100;
  CLONE_FS       = $00000200;
  CLONE_FILES    = $00000400;
  CLONE_SIGHAND  = $00000800;
  CLONE_PARENT   = $00008000;
  CLONE_THREAD   = $00010000;
  CLONE_IO       = $80000000;

  THREAD_FLAGS   = CLONE_VM or CLONE_FS or CLONE_FILES or CLONE_SIGHAND or CLONE_PARENT or CLONE_THREAD or CLONE_IO;

  PROT_READ      = $1;
  PROT_WRITE     = $2;

  MAP_ANONYMOUS  = $20;
  MAP_PRIVATE    = $2;
  MAP_GROWSDOWN  = $100;

  SYS_CLONE      = 56;

type
  TThreadData = record
    Func: TThreadFunc;
    Arg: Pointer;
  end;
  PThreadData = ^TThreadData;

function ThreadWrapper(Data: Pointer): PtrInt; cdecl;
var
  ThreadData: PThreadData;
begin
  WriteLn('ThreadWrapper: Starting thread...');
  if Data = nil then
  begin
    WriteLn('ThreadWrapper: Data is nil!');
    Exit(-1);
  end;
  ThreadData := PThreadData(Data);
  if ThreadData = nil then
  begin
    WriteLn('ThreadWrapper: ThreadData is nil!');
    Exit(-1);
  end;
  if not Assigned(ThreadData^.Func) then
  begin
    WriteLn('ThreadWrapper: ThreadFunc is nil!');
    Exit(-1);
  end;
  WriteLn('ThreadWrapper: Calling ThreadFunc...');
  Result := ThreadData^.Func(ThreadData^.Arg);
  WriteLn('ThreadWrapper: Thread finished with result: ', Result);
end;

constructor TSysClone.Create(ThreadFunc: TThreadFunc; Arg: Pointer; StackSize: csize_t);
begin
  WriteLn('TSysClone.Create: Initializing thread...');
  inherited Create;
  FThreadFunc := ThreadFunc;
  FArg := Arg;
  FStackSize := StackSize;
  if not CreateStack then
    raise Exception.Create('Failed to allocate stack');
  WriteLn('TSysClone.Create: Stack allocated successfully');
end;

destructor TSysClone.Destroy;
begin
  WriteLn('TSysClone.Destroy: Freeing resources...');
  if FThreadID <> 0 then
  begin
    WriteLn('TSysClone.Destroy: Waiting for thread ', FThreadID, ' to finish...');
    Join;
  end;
  FreeStack;
  inherited Destroy;
  WriteLn('TSysClone.Destroy: Resources freed');
end;

function TSysClone.CreateStack: Boolean;
begin
  WriteLn('TSysClone.CreateStack: Allocating stack of size ', FStackSize, ' bytes...');
  FStack := fpmmap(nil, FStackSize, PROT_READ or PROT_WRITE, MAP_ANONYMOUS or MAP_PRIVATE or MAP_GROWSDOWN, -1, 0);
  Result := FStack <> MAP_FAILED;
  if Result then
    WriteLn('TSysClone.CreateStack: Stack allocated at address ', HexStr(@PtrUInt(FStack)))
  else
    WriteLn('TSysClone.CreateStack: Failed to allocate stack');
end;

procedure TSysClone.FreeStack;
begin
  if FStack <> nil then
  begin
    WriteLn('TSysClone.FreeStack: Freeing stack at address ', HexStr(@PtrUInt(FStack)));
    if fpmunmap(FStack, FStackSize) = -1 then
      WriteLn('TSysClone.FreeStack: Failed to free stack: ', fpGetErrNo)
    else
      WriteLn('TSysClone.FreeStack: Stack freed successfully');
    FStack := nil;
  end
  else
    WriteLn('TSysClone.FreeStack: Stack is already nil');
end;

function TSysClone.Start: Boolean;
var
  StackTop: Pointer;
  ThreadData: PThreadData;
begin
  WriteLn('TSysClone.Start: Preparing to start thread...');
  if FStack = nil then
  begin
    WriteLn('TSysClone.Start: Stack is nil!');
    Exit(False);
  end;
  StackTop := Pointer(PtrUInt(FStack) + FStackSize);
  StackTop := Pointer(PtrUInt(StackTop) and not $F);
  WriteLn('TSysClone.Start: Stack top at address ', HexStr(@PtrUInt(StackTop)));

  ThreadData := StackTop - SizeOf(TThreadData);
  ThreadData^.Func := FThreadFunc;
  ThreadData^.Arg := FArg;
  WriteLn('TSysClone.Start: Thread data at address ', HexStr(@ThreadData));
  WriteLn('TSysClone.Start: ThreadFunc: ', HexStr(@ThreadData^.Func));
  WriteLn('TSysClone.Start: ThreadArg: ', HexStr(@ThreadData^.Arg));

  WriteLn('TSysClone.Start: Calling clone syscall...');
  FThreadID := do_SysCall(SYS_CLONE, THREAD_FLAGS, Int64(StackTop), Int64(@ThreadWrapper), Int64(ThreadData), 0);
  Result := FThreadID <> -1;
  if Result then
    WriteLn('TSysClone.Start: Thread started with ID ', FThreadID)
  else
    WriteLn('TSysClone.Start: Failed to start thread');
end;

function TSysClone.Join: PtrInt;
var
  Status: cint;
begin
  WriteLn('TSysClone.Join: Waiting for thread ', FThreadID, ' to finish...');
  if FThreadID = 0 then
  begin
    WriteLn('TSysClone.Join: Thread ID is 0, skipping waitpid');
    Exit(-1);
  end;
  if fpwaitpid(FThreadID, @Status, 0) = -1 then
  begin
    WriteLn('TSysClone.Join: waitpid failed: ', fpGetErrNo);
    Exit(-1);
  end;
  Result := WEXITSTATUS(Status);
  WriteLn('TSysClone.Join: Thread finished with status ', Result);
end;

end.


Код: Выделить всё
program SysCloneTest;

{$MODE OBJFPC}

uses
  syscloneunit, sysutils;

function ThreadFunc(Arg: Pointer): PtrInt; cdecl;
var
  I: Integer;
begin
  WriteLn('ThreadFunc: Starting thread function...');
  for I := 1 to 10 do
  begin
    WriteLn('ThreadFunc: Hello from thread!');
    Sleep(100);
  end;
  Result := 0;
  WriteLn('ThreadFunc: Thread function finished');
end;

var
  Thread: TSysClone;

begin
  WriteLn('Main: Starting program...');
  Thread := TSysClone.Create(@ThreadFunc, nil);
  try
    if Thread.Start then
    begin
      WriteLn('Main: Thread started');
      Thread.Join;
    end
    else
      WriteLn('Main: Failed to start thread');
  finally
    Thread.Free;
  end;
  WriteLn('Main: Program finished');
end.
Аватара пользователя
Alexander
энтузиаст
 
Сообщения: 819
Зарегистрирован: 18.12.2005 19:10:00
Откуда: оттуда

Пред.

Вернуться в Разное

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6

Рейтинг@Mail.ru