![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Скорость
Igor_thief © (2005-01-10 16:11:00)Будет ли процесс обработки проходить быстрее, если все операции которые выполняются в одном цикле разбить на несколько циклов. Например: в одном цикле выполняется открытие таблицы Excel, пошаговое считывание данных с нее и сразу же идет их обработка, запись в БД и в другую Excel таблицу. Будет ли быстрее сделать так: сначала в цикле открыть таблицу Excel, по ходу считывать данные и преобразовав их, писать в БД. Потом в другом цикле писать из БД в выходную таблицу Excel?
Eraser (2005-01-12 13:46:00) [1]Igor_thief
И всё таки мне кажется, что надо писать раздельно, потому что даже физически винчестер быстрее читает непрерывные данные, чем из разных кусков, т.е. при достаточном объёме ОЗУ, быстрее сначала прочитать данные в память, произвести вычисления, и записать данные на винт.
Igor_thief (2005-01-12 13:42:00) [2]Eraser © (12.01.05 13:35) [10]
Отчасти ты прав. Действительно надо следит за читаельностью кода. Но ведь иногда надо написать код который будет немного трудочитаем (но зато стабилен на столько, что если и когда то прейдется к нему заглянуть, то это будет ну очень не скоро), но зато быстроисполняем :), потомучто народ то будет пользоваться программой, а не ее исходником.
kaZaNoVa © (12.01.05 13:08) [8]
Спасибо, я потестирую.
Eraser (2005-01-12 13:35:00) [3]Не стоит гнаться за скоростью, если это сильно запутает программу! Лучше выполнять операции с базой данных отдельно, с Exel отдельно, т.к. при, например, перебое с эл. питанием может пострадать и то и другое. Да и вообще надо придерживаться чёткой структуры иначе через месяц сам не разберёшь что писал, не говоря о других...
kaZaNoVa (2005-01-12 13:09:00) [4]kaZaNoVa © (12.01.05 13:08) [8]
Var
k,n,h,p:int64;
kaZaNoVa (2005-01-12 13:08:00) [5]вот можно ТОЧНО мерять время ;))
procedure taimer(a:boolean);
Begin
if a then begin
p:=gettickcount; QueryPerformanceFrequency(h); QueryPerformanceCounter(k);
end else begin
QueryPerformanceCounter(n);
MessageBox(0,'Ready',Pchar(Inttostr(gettickcount-p)+' ms ('+(Inttostr(round(1000000*(n-k)/h)))+') microsec'),0);
end;end;
----
begin
taimer(true);
//работаем ..
taimer(false);
-----
Igor_thief (2005-01-12 12:11:00) [6]Vasya.ru © (12.01.05 0:52) [6]
Всем большое спасибо.
Vasya.ru (2005-01-12 00:52:00) [7]в одном цикле выполняется открытие таблицы Excel,
а вот это нехорошо
В смысле нехорошо открывать/закрывать в цикле. Это надо делать ДО цикла
begin...end (2005-01-11 20:52:00) [8]> [4] Igor_thief (11.01.05 20:39)
> Подскажи каким способом, плиз.
var
T: Cardinal;
begin
T := GetTickCount;
// Здесь - исследуемый код
T := GetTickCount - T;
ShowMessageFmt('Код выполнялся в течение %d миллисекунд', [T])
end.
Если код выполняется слишком быстро (получающееся значение T близко к нулю), то можно его прогонять не один раз (разумеется, тот вариант кода, с которым производится сравнение, тоже нужно будет выполнить столько же раз). Например:
const
CycleCount = 1000;
var
I: Integer;
T: Cardinal;
begin
T := GetTickCount;
for I := 1 to CycleCount do
// Здесь - исследуемый код
T := GetTickCount - T;
ShowMessageFmt('%d повторений кода выполнялись в течение %d миллисекунд', [CycleCount, T])
end.
Igor_thief (2005-01-11 20:39:00) [9]begin...end © (10.01.05 16:13) [1]
Подскажи каким способом, плиз.
Anatoly Podgoretsky © (10.01.05 16:20) [2]
Что за N?
> Время выполнения пустого цикла
Это сколько?
> Время на выполнение действий
Как выщитать?
Piter © (10.01.05 16:53) [3]
Время на выполнение действий
100%
Piter (2005-01-10 16:53:00) [10]Да, теория без практика мертва
Anatoly Podgoretsky (2005-01-10 16:20:00) [11]Время = Время выполнения пустого цикла + Время на выполнение действий. Второе константа, а перовое умножается на N
begin...end (2005-01-10 16:13:00) [12]> Igor_thief (10.01.05 16:11)
Время выполнения двух вариантов можно измерить.