![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Увеличится ли скорость в моём случае если я сделаю 2 потока? [D7, WinXP]
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]
Грамотным построение программы, но увеличить практически невозможно, диски это медленное устройство. Кешируй, не ищи во всю глубину, используй предсказания и так далее.