Максимальное разумное количество работающих потоков .

Вопросы программирования и использования среды Lazarus.

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

Re: Максимальное разумное количество работающих потоков .

Сообщение Alex2013 » 20.02.2025 15:12:57

xchgeaxeax писал(а):А причем тут виртуализация, когда речь про скорости дисков. А на виртуалке там будет так и так прокладка в виде этой самой виртуалки.

В том то и фокус "аппаратной виртуализации" что она может рулить железом напрямую (То есть "Гостевая ОС" по идее может получить аппаратный доступ к физическому разделу диска или целому физическому диску ( причем иногда даже в том случае если основная "хост-ОС" совершенно "не подозревает о его существании") возни там правда может быть довольно много но иногда это оправдано)
Alex2013
долгожитель
 
Сообщения: 3102
Зарегистрирован: 03.04.2013 11:59:44

Re: Максимальное разумное количество работающих потоков .

Сообщение xchgeaxeax » 20.02.2025 15:34:20

Ну вот это надо диск подключать напрямую, а не использовать файл. Это как раз и замедляет. Какой смысл в таком тестировании.
xchgeaxeax
постоялец
 
Сообщения: 151
Зарегистрирован: 11.05.2023 03:51:40

Re: Максимальное разумное количество работающих потоков .

Сообщение sts » 21.02.2025 13:47:25

раньше, как тока появились многоядерные процы, максимально эффективное к-во потоков было = к-во ядер минус одно для операционной системы, последние лет 10, минус два ядра, один для IO, другой для менеджера потоков.
sts
постоялец
 
Сообщения: 443
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Re: Максимальное разумное количество работающих потоков .

Сообщение Alex2013 » 22.02.2025 12:47:53

Брр ... JPEGImage.LoadFromStream(ST); (JPEGImage:TFPMemoryImage) достал ! Нормально читать поток (MemoryStream) с произвольной позиции не хочет совершенно (упроно читает только первую картинку в потоке) причем закидон где-то в TFPReaderJPEG .(Пробовал сделать "заплатку" но тут этот фокус не прошел)

Так что пока плюнул и написал простой конвертер Jpg2Bmp...
(он работает но с потерей универсальности TFPMemoryImage)
Код: Выделить всё
Function Jpg2Bmp( jpg:TStream ):TBitmap;
var b:TBitmap;
   j:TJPEGImage;
begin
result := nil;
try
   j :=TJPEGImage.Create;
   try
     j.LoadFromStream(jpg);
      b := TBitmap.Create;
     try
       b.Assign(j);
    except
     FreeAndNil(B);
     end;
   finally
     j.Free;
   end;
   Result:=B;
except
   Result := Nil;
end;
end;

Зы
Вообщем пока я все еще пытаюсь протащить контейнер из "общего " MemoryStream, но уже начинаю сомневаться "так ли это полезно как красиво" . :roll:

Добавлено спустя 18 минут 45 секунд:
sts писал(а):раньше, как тока появились многоядерные процы, максимально эффективное к-во потоков было = к-во ядер минус одно для операционной системы, последние лет 10, минус два ядра, один для IO, другой для менеджера потоков.

Раньше я тоже думал примерно так-же и постоянно пытался подстроится под количество "физических" потоков и ядер .
Но потом выяснилось что использование заметно большего количества "виртуальных потоков" ускоряет работу "распараллеленных" алгоритмов более чем успешно . (Что очень наглядно видно и на примере моей "тестовой платформы" )
Последний раз редактировалось Alex2013 22.02.2025 15:51:59, всего редактировалось 2 раз(а).
Alex2013
долгожитель
 
Сообщения: 3102
Зарегистрирован: 03.04.2013 11:59:44

Re: Максимальное разумное количество работающих потоков .

Сообщение xchgeaxeax » 22.02.2025 14:03:03

Может проще сделать дополнительный стрим TPartialStream = class(TStream) constructor Create(Source: TStream; Offset: Int64; Size: Int64); соответственно она нужна просто для того, чтобы скормить ей TMemoryStream, из которого она будет отдавать только указанный в конструкторе кусочек от Offset до Offset + Size

Не копировать в себя, а сохранять исходный TMemoryStream и при загрузке через LoadFromStream считывать из него заданный диапазон
xchgeaxeax
постоялец
 
Сообщения: 151
Зарегистрирован: 11.05.2023 03:51:40

Re: Максимальное разумное количество работающих потоков .

Сообщение Alex2013 » 22.02.2025 15:48:30

xchgeaxeax писал(а):Может проще сделать дополнительный стрим TPartialStream = class(TStream) constructor Create(Source: TStream; Offset: Int64; Size: Int64); соответственно она нужна просто для того, чтобы скормить ей TMemoryStream, из которого она будет отдавать только указанный в конструкторе кусочек от Offset до Offset + Size

Не копировать в себя, а сохранять исходный TMemoryStream и при загрузке через LoadFromStream считывать из него заданный диапазон

Это разумеется тоже вариант (причем он точно лучше чем просто копировать текущую картинку в дополнительный поток или неким "хитрым образом" подменять адрес блока данных (первый вариант работает хотя и подтормаживает , а на второй видимо моей "хитрости" не хватило )) ... но это все равно "костыль" ! :( Однако попробовать можно. Спасибо !

Добавлено спустя 2 часа 42 минуты 56 секунд:
Заплатка работает !
Код: Выделить всё
Type
     TTmpStream = class(TMemoryStream)
          F_Offset: Int64;
           constructor Create;
           function Read(var Buffer; Count: Longint): Longint; Override;
     end;
   constructor  TTmpStream .Create;
     begin
       F_Offset:= 0;
     inherited Create;

     end;
   function  TTmpStream.Read(var Buffer; Count: Longint): Longint;

   begin
   If  Position< F_Offset then
      Position:= Position+F_Offset;
       inherited;
    end;
...
TTmpStream(MS).F_Offset:=PPos^.P;
B:=LoadAndScaleImage('',W,H,Ms,Pos^.P);
TTmpStream(MS).F_Offset:=0;
..

Парада это сугубо локальное "местечковое" решение которое работает только потому что в цикле ничего другого кроме "последовательного" LoadAndScaleImage нет
.
Alex2013
долгожитель
 
Сообщения: 3102
Зарегистрирован: 03.04.2013 11:59:44

Пред.

Вернуться в Lazarus

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

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

Рейтинг@Mail.ru