Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Увеличится ли скорость в моём случае если я сделаю 2 потока? [D7, WinXP]


Страницы:   1 2 3 4 5

rolex ©   (2005-03-08 18:45:00) 

Моя прога предположим ищет файлы на винте. Увеличится ли скорость общего поиска, если я его разобью на 2 потока?


rolex   (2005-03-09 16:56:00) [61]


> не "тыкай" сабж где ни попадя - будет тебе существенное
> увеличение сквозной производительности

А где лишние Application.ProcessMessages в моём коде???


> оптимизируй свой алгоритм, удалив множественные явные именованые
> обращения к одним и тем же идентификаторам, используя взамен
> этого оператор with - будет дополнительное увеличение сквозной
> производительности

Т.е. это значит в, например, коде:
Form1.width:=...;
form1.height:=...;
form1.title:=...;
Мне нужно сделать так:
with Form1 do
begin
width:=...;
height:=...;
title:=...;
end;

я так понял?


> минимизируй строковые операции - будет тебе приращение той
> же произв-ти за счет меньшего числа перераспределений памяти
> встроенным менеджером памяти

Не понял... можно по подробнее.


> в конце-концов - переделать алгоритм целиком, читая каталоговую
> структуру однократно, а затем фиксируя лишь события ее изменения

Это я тоже не понял. Объясните плз!!!


Erik1   (2005-03-09 15:39:00) [62]

И рекурсию можно убрать, тоже производительность увеличится( http://www.codenet.ru/progr/other/prbook/gl8.php)


Digitman   (2005-03-09 13:40:00) [63]


> Application.ProcessMessages через каждую строчку понатыкано


не "тыкай" сабж где ни попадя - будет тебе существенное увеличение сквозной производительности

оптимизируй свой алгоритм, удалив множественные явныеименованые обращения к одним и тем же идентификаторам, используя взамен этого оператор with - будет дополнительное увеличение сквозной производительности

минимизируй строковые операции - будет тебе приращение той же произв-ти за счет меньшего числа перераспределений памяти встроенным менеджером памяти

да мало ли чего еще тут можно оптимизировать ! ... судя по коду - просто поле непаханое ..

в конце-концов - переделать алгоритм целиком, читая каталоговую структуру однократно, а затем фиксируя лишь события ее изменения


raidan   (2005-03-09 13:13:00) [64]

Увеличить скорость можно, если есть несколько дисков как физических устройств и читать параллельно с них. Хотя это уже извращения. Кому нужна большАя скорость - тот сделает себе RAID-0.


rolex   (2005-03-09 13:03:00) [65]

Аааа.... столько текста набирал!!! Всё стёрлось! Заново писать уже сил нету. Короче вот процедура поиска (выдрал прямо из исходников без изменения), если разберётесь конечно:
procedure ScanDrive(const DirName, Mask :String);
 procedure ScanDirs(const DirName :String);
 var
   h   :tHandle;
   wfd :tWin32FindData;
   s,i,iskl:integer;
   sizeDir:TLargeInteger;
 begin
 Application.ProcessMessages;
 form1.Label2.Caption:='Поиск в '+DirName;
   h := Windows.FindFirstFile(PChar(DirName+Mask), wfd);
   try
     if (h<>INVALID_HANDLE_VALUE) and (Not((DirName=Form2.Edit1.Text)and(Form2.RadioButton3.Checked=True))) then begin
       repeat
         Application.ProcessMessages;
         if  ((wfd.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY)=0) then begin
           for s:=0 to Form2.CheckListBox2.Count - 1 do begin
             Application.ProcessMessages;
             if (Form2.CheckListBox2.Checked[s]) and (Form1.FScanAborted=false) and (MatchesMask(wfd.cFileName, Form2.CheckListBox2.Items[s])=true) and (HaveCopyItem(DirName+wfd.cFileName)=False) then
             if (MatchesMask(wfd.cFileName, Form2.CheckListBox2.Items[s]))=true then //-- Двойная проверка
             begin
               iskl:=0; //-- Проверка на исключения
               for i:=0 to Form2.ListBox1.Count-1 do if (MatchesMask(wfd.cFileName, Form2.ListBox1.Items[i]))=true then begin iskl:=1; if HaveCopyItemOnExclusion(DirName+wfd.cFileName)<>true then with Form5.ListView1.Items.Add do begin Caption:=DirName+wfd.cFileName; SubItems.Add(Form2.CheckListBox2.Items[s]); SubItems.Add(Form2.ListBox1.Items[i]); end; end;
               if iskl<>1 then
               begin
               form1.CheckListBox1.Items.Add(DirName+wfd.cFileName);
               chetchik:=chetchik+1;
               Form1.label14.Caption:=IntToStr(StrToInt(Form1.label14.Caption)+1);
               fsize:=fsize+GetFileSize(DirName+wfd.cFileName);
               ToShowSize;
               end else Form1.label1.Caption:=IntToStr(StrToInt(Form1.label1.Caption)+1);
             end;
           end;
         foundedsize:=foundedsize+GetFileSize(DirName+wfd.cFileName);
         form1.ProgressBar1.width:=((form1.Width-12)div 100)*(100*foundedsize div allsize+1);
         form1.Image9.Left:=form1.ProgressBar1.width+form1.ProgressBar1.left;
         end;
       until  (not Windows.FindNextFile(h,wfd)) or (Form1.FScanAborted=true);
     end else if (DirName=Form2.Edit1.Text)and(Form2.RadioButton3.Checked=True) then begin SizeDir:=0; GetDirSize(DirName, SizeDir); foundedsize:=foundedsize+SizeDir; end;
   finally
     if  h <> INVALID_HANDLE_VALUE  then Windows.FindClose(h);
   end;
   Application.ProcessMessages;
   // Теперь рекрсивно просмотрим подкаталоги
   h := Windows.FindFirstFile(PChar(DirName+'*.*'), wfd);
   try
   Application.ProcessMessages;
     if  h <> INVALID_HANDLE_VALUE  then begin
       repeat
         Application.ProcessMessages;
         if   ((wfd.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) <> 0)
          and (wfd.cFileName <> String('.'))
          and (wfd.cFileName <> '..')           then
           ScanDirs(IncludeTrailingPathDelimiter(DirName+wfd.cFileName));
           Application.ProcessMessages;
       until  (not Windows.FindNextFile(h,wfd)) or (Form1.FScanAborted=true) or (Application.Terminated);
     end;
   finally
     if  h <> INVALID_HANDLE_VALUE  then Windows.FindClose(h);
   end;
 end;
begin // FindFilesByMask
 ScanDirs(IncludeTrailingPathDelimiter(DirName));
 Application.ProcessMessages;
end;


Erik1   (2005-03-09 11:15:00) [66]

В отдельный поток всеравно стоит вынести и отделить от нитерфейсной части. Структура программы станент более правильной и Application.ProcessMessage ненадо будет тыкать везде где возможно. А вобще еденичный поиск происходит относительно быстро, в ускорении процеса тебе может помочь другая логическая организация. Попробуй полностью изложить постаноыку задачи.


rolex   (2005-03-08 21:06:00) [67]


> ...Если просто по имени файла в файловой системе...

Именно это и делает моя программа.
Т.е. по вашим словам FindFirst и FindNext - быстрее уже ничего нереально сделать. Так?


Дмитрий Мыльников   (2005-03-08 21:02:00) [68]

А в чём, собственно, заключается поиск-то? Если просто по имени файла в файловой системе, то тут основную работу будет делать OC, так что многопоточность ничего не даст. Если же производится ещё и анализ внутренних данных в самих файлах, то тогда многопоточность при небольшом количестве потоков может ускорить работу программы. Пока один поток получает данные, другие будут заняты анализом.

Что же касается кэширования, то мне кажется, что в данном случае это не сильно поможет, поскольку кэширование даёт выигрыш при многократном обращении к одним и тем же данным, что нехарактерно для поиска.


rolex   (2005-03-08 21:01:00) [69]


> Sphinx ©   (08.03.05 20:13) [17]
> А может попробовать использовать службу индексирования в
> NT-системах...или она только в ХР есть...или тольно на NTFS...запамятовал...???
> Но включение индексирования действительно ускоряет поиск...

Поподробнее пожалуйста...


Sphinx   (2005-03-08 20:13:00) [70]

А может попробовать использовать службу индексирования в NT-системах...или она только в ХР есть...или тольно на NTFS...запамятовал...???
Но включение индексирования действительно ускоряет поиск...


Набережных С.   (2005-03-08 19:53:00) [71]


> Anatoly Podgoretsky ©   (08.03.05 19:48) [15]
>  а в данной постановке замедление и снижение надежны работы,
> из-за уровня знаний.

:)))


Anatoly Podgoretsky   (2005-03-08 19:48:00) [72]

Набережных С. ©   (08.03.05 19:35) [14]
Вот когда будет другая предпосылка, чем в данном вопросе, тогда можно будет и о другом поговорить, а в данной постановке замедление и снижение надежны работы, из-за уровня знаний.


Набережных С.   (2005-03-08 19:35:00) [73]


> Anatoly Podgoretsky ©   (08.03.05 19:33) [13]

Совершенно согласен. Но одно другого, имхо, не отменяет.


Anatoly Podgoretsky   (2005-03-08 19:33:00) [74]

Набережных С. ©   (08.03.05 19:32) [12]
Смотри 7


Набережных С.   (2005-03-08 19:32:00) [75]


> Anatoly Podgoretsky ©   (08.03.05 19:23) [10]

Ну а поиск что? Считал пару десятков мег и обрабатывай, а в это время считывай следующую пару десятков. Да и процессоры с HT все больше распространяются. Нет, я думаю, надо учитывать возможность многопроцессорности, программа должна уметь подстраиваться. Конечно, придется попотеть с организацией, но, имхо, попробовать стоит.


Набережных С.   (2005-03-08 19:27:00) [76]

Переключение потоков конечно время займет, но NT - не 9х, тут это довольно шустро. Я как-то делал кучу тестов, так на достаточно длительной операции разницы между выполнением ее одним потоком или несколькими, практически нет, в пределах погрешности измерений.


Anatoly Podgoretsky   (2005-03-08 19:23:00) [77]

Набережных С. ©   (08.03.05 19:20) [9]
Ну ему то не это надо ускорить, не паралельные вычисления, а поиск на диске. Тут два потока дадут замедление из-за постоянного движения головок туда сюда.


Набережных С.   (2005-03-08 19:20:00) [78]


> rolex   (08.03.05 19:09) [6]

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


Antonn   (2005-03-08 19:19:00) [79]


> ПДП

DMA?


Anatoly Podgoretsky   (2005-03-08 19:10:00) [80]

rolex   (08.03.05 19:07) [5]
Грамотным построение программы, но увеличить практически невозможно, диски это медленное устройство. Кешируй, не ищи во всю глубину, используй предсказания и так далее.


Страницы:   1 2 3 4 5

Наверх

Титульная страница Поиск, карта сайта Написать письмо