Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2012.05.13;
Скачать: [xml.tar.bz2];

Вниз

Вопрос в ускорении расчёта.   Найти похожие ветки 

 
Drowsy ©   (2012-01-10 07:17) [0]

В базе данных до фига небольших по количеству, но "длинных" записей таблиц.
Расчётный алгоритм связан с активной навигацией по датасетам этих таблиц.
Вопрос в ускорении расчёта.
Например, если работать не с датасетами, а со связанными списками записей, ускорит ли это расчёт?


 
Омлет ©   (2012-01-10 09:27) [1]

1. Прямой доступ к памяти всегда быстрее.
2. Код в студию.


 
OW ©   (2012-01-10 09:35) [2]

если мало записей, и они неизменны,
может, просто создавать массив и работать с ним?

а есть ли в коде .DisableControls? Порой забываешь про него, а с ним скорость уже приемлимой становится, без дальнейших телодвижений


 
Jeer ©   (2012-01-10 09:36) [3]


> Вопрос в ускорении расчёта.


Вопрос в архитектуре, а Ваш вопрос - ее следствие.


 
Jeer ©   (2012-01-10 09:45) [4]


> а есть ли в коде .DisableControls?


Если нет связанных DBAware, то и метод не нужен.


 
OW ©   (2012-01-10 09:51) [5]


> Если нет связанных DBAware, то и метод не нужен.

Уверен?


 
OW ©   (2012-01-10 10:16) [6]

точно не помню где не проверяется, как-то находил, потом забыл где именно, только помню вывод. А он таков: ставить всегда, есть или нет DBAware или что-то еще. Не важно. Ставить.
Проверка:
var
 i: Integer;
 BoolDC: Boolean;
 DC, NDC: Cardinal;
 TC: Cardinal;
begin
 aq1.Open;
 DC := 0;
 NDC := 0;
 for i := 0 to 999 do
 begin
   aq1.EnableControls;
   BoolDC := (i mod 2 = 0);
   if BoolDC then
    aq1.DisableControls;
   TC := GetTickCount;
   aq1.First;
   while not(aq1.Eof) do
   begin
     aq1.Next;
   end;
   if BoolDC then
     DC := DC + GetTickCount - TC else
     NDC := NDC + GetTickCount - TC;
 end;
 ShowMessageFmt("DisCtrl %d -- NoDisCtrl %d",[DC, NDC]);


656 vs 1204 тика


 
sniknik ©   (2012-01-10 10:45) [7]

>> Если нет связанных DBAware, то и метод не нужен.
> Уверен?
уверен что нужен... (для ADO точно), проверка через "внешний объект" гораздо тяжелее отсутствия оной.


 
Drowsy ©   (2012-01-10 10:57) [8]


> Jeer ©   (10.01.12 09:36) [3]
> Вопрос в архитектуре

архитектуре чего?


 
Drowsy ©   (2012-01-10 11:00) [9]


> а есть ли в коде .DisableControls?

Нет, все убраны.
луук-ап и калкулс полей в датасетах тоже нет.


 
OW ©   (2012-01-10 11:00) [10]


> sniknik ©   (10.01.12 10:45) [7]

я и говорю,
там где то стоит попытка уведомления контрла о смене активной записи
похоже у TDataSet (или TDataLink - забыл)
даже если контрла нет. т.е. аля если не задисэйблено, то попытаться уведомить бла-бла.. В процессе бла-бла выясняется, что уведомить некого, но попытка состоялась и время отнято.


 
OW ©   (2012-01-10 11:01) [11]


> > а есть ли в коде .DisableControls?
>
> Нет, все убраны.

а надо поставить :)


 
RWolf ©   (2012-01-10 11:06) [12]


> OW ©   (10.01.12 11:01) [11]

D7, db.pas:
procedure TDataSet.DataEvent(Event: TDataEvent; Info: Longint);
...
begin
 NotifyDataSources := not (ControlsDisabled or (State = dsBlockRead));
...
 if NotifyDataSources then
 begin
   for I := 0 to FDataSources.Count - 1 do
     TDataSource(FDataSources[I]).DataEvent(Event, Info);
   if FDesigner <> nil then FDesigner.DataEvent(Event, Info);
 end;
end;

если к датасету не присоединено ни одного DataSource, смысла запрещать контролы не видно.


 
Drowsy ©   (2012-01-10 11:14) [13]


> OW ©   (10.01.12 11:01) [11]
>
>
> > > а есть ли в коде .DisableControls?
> >
> > Нет, все убраны.
>
> а надо поставить :)

ну да, поставлены. )


 
Drowsy ©   (2012-01-10 11:14) [14]


> луук-ап и калкулс полей в датасетах тоже нет.

в смысле - убраны. )


 
OW ©   (2012-01-10 11:16) [15]


> RWolf ©   (10.01.12 11:06) [12]


сходу тоже не нашел
но тем не менее практические проверки (код из [6], например) упрямо говорят, что есть смысл


 
OW ©   (2012-01-10 11:21) [16]


> Drowsy ©


если мало записей, и они неизменны (очень мало изменяемые),
может, просто создавать массив(ы) и работать с ним(и)?

>> Расчётный алгоритм связан с активной навигацией по датасетам этих таблиц.
что за расчеты, кстати?
можно ли код?


 
RWolf ©   (2012-01-10 11:25) [17]


> OW ©   (10.01.12 11:16) [15]
> > RWolf ©   (10.01.12 11:06) [12]сходу тоже не нашелно тем
> не менее практические проверки (код из [6], например) упрямо
> говорят, что есть смысл

прогнал код на локальной базе Firebird 1.5, таблица из 68 тыс. записей, выборка одного поля.
результаты совпадают в пределах погрешности.


 
OW ©   (2012-01-10 11:33) [18]


> RWolf ©   (10.01.12 11:25) [17]

М-да?..
А компоненты какие?


 
RWolf ©   (2012-01-10 11:34) [19]


> [18]

FIBPlus 6.9.6.


 
sniknik ©   (2012-01-10 12:41) [20]

> FIBPlus 6.9.6.
> уверен что нужен... (для ADO точно), проверка через "внешний объект" гораздо тяжелее отсутствия оной.

FIBPlus это COM объект?


 
Ega23 ©   (2012-01-10 12:55) [21]


> RWolf ©   (10.01.12 11:06) [12]
>
> если к датасету не присоединено ни одного DataSource, смысла
> запрещать контролы не видно.


http://delphimaster.net/view/3-1235739432
Особенно [7].


 
OW ©   (2012-01-10 13:17) [22]

Проверил на ODAC, (TOraDataSet) - нет разницы
значит, ADO (com-объекты) только этим грешит.
значит, на TDataSet зря грешил. Спутал с TAdoDataSet, наверное.
Но все равно, отключить - хуже не будет. Неизвестно через чего ТС работает.


 
RWolf ©   (2012-01-10 13:19) [23]


> Ega23 ©   (10.01.12 12:55) [21]

да, в TCustomADODataSet логика использует ControlsDisabled в условии обращения к COM-серверу; запрещать контролы нужно.


 
Ega23 ©   (2012-01-10 13:21) [24]


> Но все равно, отключить - хуже не будет. Неизвестно через
> чего ТС работает.


Во-во, я после той ветки на воду всегда дую. Хотя казалось бы...


 
Jeer ©   (2012-01-10 14:03) [25]


> Во-во, я после той ветки на воду всегда дую.


Ну а я, поскольку давно забил на АДО и проверил данный функционал для всех используемых мной технологий доступа, ленюсь вписывать две строчки :)
Хотя, спорить не буду - *.Disable*, .*Enable.*, это универсальный подход.


 
Jeer ©   (2012-01-10 14:12) [26]


> Drowsy ©   (10.01.12 10:57) [8]
>
>
> > Jeer ©   (10.01.12 09:36) [3]
> > Вопрос в архитектуре
>
> архитектуре чего?


Архитектуре разрабатываемой Вами программной системы.

Архитектура - это комплекс принятых для реализации технических решений (технологий), [организационных мероприятий] по хранению, обработке и визуализации данных для максимально полного удовлетворения заданного функционала системы в оговоренной прикладной сфере. (С) Jeer


 
Jeer ©   (2012-01-10 14:13) [27]


> если работать не с датасетами, а со связанными списками
> записей,


Есть еще датасеты в памяти, файлы в памяти.. :)


 
Anatoly Podgoretsky ©   (2012-01-10 17:56) [28]


> > а есть ли в коде .DisableControls?
>
> Нет, все убраны.

Там не написано DisableDbAwareControls


 
Anatoly Podgoretsky ©   (2012-01-10 18:00) [29]

Еще есть мастер-детайл связи, эффект еще более драматичен.


 
Jeer ©   (2012-01-10 20:24) [30]


> Anatoly Podgoretsky ©   (10.01.12 18:00) [29]


Пока не будет от ТС внятного пояснения проблем с "расчетами" - можно долго медитировать на Ктулху.
Однако, похоже, ТС сильно испугался такого наплыва советчиков и слинял.


 
Anatoly Podgoretsky ©   (2012-01-10 21:11) [31]

> Jeer  (10.01.2012 20:24:30)  [30]

Да не только количества испугался, а также, что они говорят какие то
непонятные слова.


 
Drowsy ©   (2012-01-10 21:29) [32]


> Anatoly Podgoretsky ©   (10.01.12 17:56) [28]

Кроме этого, всё, вроде бы, понятно.
Если речь пошла об алгоритмах расчёта, то
- они занимают 45 машинописных листов, но, в основном тупые арифметические действия с данными и коэффициентами из таблиц.
- ясно, что последует совет искать "слонов" в архитектуре и организации расчёта, как справедливо говорит Jeer.


 
Drowsy ©   (2012-01-10 21:44) [33]

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


 
Dennis I. Komarov ©   (2012-01-10 21:56) [34]


> - они занимают 45 машинописных листов, но, в основном тупые
> арифметические действия с данными и коэффициентами из таблиц.
>

И все это делается на стороне клиента? Разжигайте костер!!!


 
Drowsy ©   (2012-01-10 22:36) [35]


> Dennis I. Komarov ©   (10.01.12 21:56) [34]


в процессе расчёта надо показывать промежуточные результаты итераций.


 
Jeer ©   (2012-01-10 22:39) [36]


> И все это делается на стороне клиента?


Не вижу проблем.

Прежде всего - Задача.

Затем начинаем ее решать итерациями.

Где окажемся ? И даже не знаю - это конкретика.

Может свалим на сервер, может поделимся с ним, а может останемся на клиенте - такое решение достигается не сразу, но достигается, если голова "варит".

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

В конце концов, чередуя "размышлизмы" с тестами, обретаем спокойствие в виде "просчитанной" и "оттестированной" архитектуры.

Дальше ?  "Обычный" кодинг.


 
Dennis I. Komarov ©   (2012-01-10 23:51) [37]


> в процессе расчёта надо показывать промежуточные результаты
> итераций.

на зачем?


> Затем начинаем ее решать итерациями.

Что мешает свалить это на сервер?
Или уж получите входные данные для алгоритма из БД и издевайтесь над ними как угодно, но СУБД то почему должен страдать?


 
Jeer ©   (2012-01-11 00:29) [38]


> Что мешает свалить это на сервер?


Може и Религия :)

Я шо-то не пойму, ко мне какие вопросы ?
Если кратко - СУБД страдает за то, шо она хорошо может делать.


 
Dennis I. Komarov ©   (2012-01-11 00:46) [39]


> Я шо-то не пойму, ко мне какие вопросы ?
> Если кратко - СУБД страдает за то, шо она хорошо может делать.

СУБД не должен страдать за итерационные методы... это не его карма, даже если у него это хорошо получается, собственно вопросы только эти... :)


 
Jeer ©   (2012-01-11 01:07) [40]


> СУБД не должен страдать за итерационные методы


Та ну ?
Т.е. бизнес-логика, перенесенная на сервер должна ограничиться 2*2 ?
Щас !

Кто-то и что-то сказал, что в случае вопроса ТС, его проблемы должны решать СУБД, алгоритмы или мы с вами ?

"То-то и оно" (С) АП.


 
Dennis I. Komarov ©   (2012-01-11 01:28) [41]

Я к тому что, либо зашить целиком алгоритм обработки данных на сервер(а-ля хранимка) и получать результат как есть, либо получить входящие данные из БД и мучить их на стороне клиента. Но не дергать/менять данные на каждую итерацию с СУБД, ибо костер ИМХО...


 
OW ©   (2012-01-11 08:50) [42]


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

самое простое - обрамить вызовы в
TC := GetTickCount;
RunProcedure;
ShowMessage(ToStr(GetTickCount - TC));
показать время выполнения в тиках

для правильных результатов требуется многочисленная прогонка. Словом, аля [6]


 
Inovet ©   (2012-01-11 09:28) [43]

> [42] OW ©   (11.01.12 08:50)
> > Вот как бы оценить, какая процедура занимает больше всего
>
> > времени в потоке расчёта..
>
> самое простое - обрамить вызовы в
> TC := GetTickCount;

Автору вроде надо вызовы в самой процедуре делать в начале и конце, и накапливать тики в глобальных переменных.


 
Inovet ©   (2012-01-11 09:29) [44]

> [43] Inovet ©   (11.01.12 09:28)
> в самой процедуре

в самих процедурах


 
OW ©   (2012-01-11 10:19) [45]


> вроде надо вызовы в самой процедуре делать в начале и конце,
>  и накапливать тики в глобальных переменных.

ну да, лучше так
я еще в хранимках так делал
begin -- proc
 set DT = getdate()
 ...
 exec WriteToLog "NameProc", DT, getdate()  
end -- proc

имеем таблу, аля  NameProcess  BeginTime  EndTime
потом выборками разными определяем, что чаще запускается, когда, сколько в среднем, сколько в среднем в зависимости от времени суток(нагрузки) и т.п.


 
Jeer ©   (2012-01-11 10:40) [46]


> Dennis I. Komarov ©   (11.01.12 01:28) [41]
>
> Я к тому что, либо зашить целиком алгоритм обработки данных
> на сервер(а-ля хранимка)


Мы знать не знаем, что у него за алгоритмы - может он там матрицы решает вместе с нейросетями :)


 
Dennis I. Komarov ©   (2012-01-11 16:19) [47]


> может он там матрицы решает вместе с нейросетями :)

ага, тапочки ухихикались... :)



Страницы: 1 2 вся ветка

Форум: "Начинающим";
Текущий архив: 2012.05.13;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.57 MB
Время: 0.003 c
15-1325830703
kudatsky
2012-01-06 10:18
2012.05.13
SWF-файлы в Delphi


4-1256828409
Ткачев А.Н.
2009-10-29 18:00
2012.05.13
Изменение имени пользователя


3-1275556179
Цукор5
2010-06-03 13:09
2012.05.13
запрос


15-1325712605
Юрий
2012-01-05 01:30
2012.05.13
С днем рождения ! 5 января 2012 четверг


4-1256672610
cerber
2009-10-27 22:43
2012.05.13
Изменить привилегии доступа к ветке реестра





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский