Форум: "Основная";
Текущий архив: 2005.01.23;
Скачать: [xml.tar.bz2];
ВнизСкорость Найти похожие ветки
← →
Igor_thief (2005-01-10 16:11) [0]Будет ли процесс обработки проходить быстрее, если все операции которые выполняются в одном цикле разбить на несколько циклов. Например: в одном цикле выполняется открытие таблицы Excel, пошаговое считывание данных с нее и сразу же идет их обработка, запись в БД и в другую Excel таблицу. Будет ли быстрее сделать так: сначала в цикле открыть таблицу Excel, по ходу считывать данные и преобразовав их, писать в БД. Потом в другом цикле писать из БД в выходную таблицу Excel?
← →
begin...end © (2005-01-10 16:13) [1]> Igor_thief (10.01.05 16:11)
Время выполнения двух вариантов можно измерить.
← →
Anatoly Podgoretsky © (2005-01-10 16:20) [2]Время = Время выполнения пустого цикла + Время на выполнение действий. Второе константа, а перовое умножается на N
← →
Piter © (2005-01-10 16:53) [3]Да, теория без практика мертва
← →
Igor_thief (2005-01-11 20:39) [4]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%
← →
begin...end © (2005-01-11 20:52) [5]> [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.
← →
Vasya.ru © (2005-01-12 00:52) [6]в одном цикле выполняется открытие таблицы Excel,
а вот это нехорошо
В смысле нехорошо открывать/закрывать в цикле. Это надо делать ДО цикла
← →
Igor_thief (2005-01-12 12:11) [7]Vasya.ru © (12.01.05 0:52) [6]
Всем большое спасибо.
← →
kaZaNoVa © (2005-01-12 13:08) [8]вот можно ТОЧНО мерять время ;))
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);
-----
← →
kaZaNoVa © (2005-01-12 13:09) [9]kaZaNoVa © (12.01.05 13:08) [8]
Var
k,n,h,p:int64;
← →
Eraser © (2005-01-12 13:35) [10]Не стоит гнаться за скоростью, если это сильно запутает программу! Лучше выполнять операции с базой данных отдельно, с Exel отдельно, т.к. при, например, перебое с эл. питанием может пострадать и то и другое. Да и вообще надо придерживаться чёткой структуры иначе через месяц сам не разберёшь что писал, не говоря о других...
← →
Igor_thief (2005-01-12 13:42) [11]Eraser © (12.01.05 13:35) [10]
Отчасти ты прав. Действительно надо следит за читаельностью кода. Но ведь иногда надо написать код который будет немного трудочитаем (но зато стабилен на столько, что если и когда то прейдется к нему заглянуть, то это будет ну очень не скоро), но зато быстроисполняем :), потомучто народ то будет пользоваться программой, а не ее исходником.
kaZaNoVa © (12.01.05 13:08) [8]
Спасибо, я потестирую.
← →
Eraser © (2005-01-12 13:46) [12]Igor_thief
И всё таки мне кажется, что надо писать раздельно, потому что даже физически винчестер быстрее читает непрерывные данные, чем из разных кусков, т.е. при достаточном объёме ОЗУ, быстрее сначала прочитать данные в память, произвести вычисления, и записать данные на винт.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.01.23;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.087 c