13.09.2010, 23:22 | #21 |
Участник
|
Цитата:
но стопудово после нас программисты заказичка будут крыть нас матерными словами за такой подход... у них есть формы-монстры, которые они сами прогают... или не будут крыть?.. в общем, про sysSetupFormRun я помню. на всякий случай: formdigger программистами заказчика установлен, освоен и используется (спасибо автору, DSPIC) |
|
13.09.2010, 23:27 | #22 |
Участник
|
Цитата:
кроме того, боюсь побочных эффектов из-за работы SysSetupFormRun (хотя formdigger стоит и не жужжит). поэтому я предполагал, что буду изменять метод init и свойство autodeclaration во всех формах, которые потенциально могут быть медленными из-за большого количества записей. Так придется менять меньше форм, чем "все формы". но все равно очень много |
|
13.09.2010, 23:35 | #23 |
Роман Долгополов (RDOL)
|
бояться ваше право. но никто ничего плохого не заметит. в худшем случае прирост производительности от отрубания фичи будет сожран этим циклом
|
|
13.09.2010, 23:41 | #24 |
Участник
|
вот-вот.
об этом и речь - шило на мыло. поэтому и спросил в надежде на возможные варианты. будем обсуждать с заказчиком. может быть, действительно стоит изменить sysSetupFormRun, если нет глобального параметра для ядра. причем самые монстроидальные формы перечислить явно в switch, чтобы аксапта не тратила время на перебор контролов при открытии. |
|
13.09.2010, 23:45 | #25 |
Роман Долгополов (RDOL)
|
Цитата:
Сообщение от mazzy
вот-вот.
об этом и речь - шило на мыло. поэтому и спросил в надежде на возможные варианты. будем обсуждать с заказчиком. может быть, действительно стоит изменить sysSetupFormRun, если нет глобального параметра для ядра. причем самые монстроидальные формы перечислить явно в switch, чтобы аксапта не тратила время на перебор контролов при открытии. |
|
|
За это сообщение автора поблагодарили: mazzy (2), sukhanchik (6). |
14.09.2010, 01:45 | #26 |
Участник
|
Цитата:
Я про это и писал. Вместо добавления кода в каждую форму - добавить только код в SysSetupFormRun, который по имени формы будет доставать нужные контролы из дизайна по имени и делать с ними что потребуется. |
|
14.09.2010, 11:35 | #27 |
Участник
|
Цитата:
Цитата:
X++: UtcDateTime dateTimeStart; ; dateTimeStart = DateTimeUtil::utcNow(); // лопатим контролы... info( strfmt( @"%1 мс", DateTimeUtil::getDifference( DateTimeUtil::utcNow(), dateTimeStart ) * 10 ) ); Цитата:
Цитата:
Цитата:
\Classes\SysSetupFormRun\DEV_getSetOfFormNames2TweakGrid X++: // возвращает множество названий форм, на Grid'ах которых нужно отключить austoSizeColumns protected Set DEV_getSetOfFormNames2TweakGrid() { Set ret = infolog.globalCache().get( classstr(SysSetupFormRun), funcname(), null ); ; if (!( ret && ret.typeId() == Types::String )) { ret = new Set( Types::String ); // собственно здесь нужно перечислить названия форм, которые нужно автоматом "допиливать" при старте ret.add( formstr(OfficialsTable_RU) ); ret.add( formstr(PurchTable) ); ret.add( formstr(SalesTable) ); // запоминаем множество в globalCache, чтоб не создавать каждый раз infolog.globalCache().set( classstr(SysSetupFormRun), funcname(), ret ); } return ret; } X++: // дополнительное допиливание дизайна формы после инициализации protected void DEV_initDesignPost() { // UtcDateTime dateTimeStart; identifiername formName = this.name(); ; if (this.DEV_getSetOfFormNames2TweakGrid().in( formName )) { // dateTimeStart = DateTimeUtil::utcNow(); DEV_iterateThroughFormControls( this.design(), null, staticmethodstr(DEV_FormHelpers, setGridAutoSizeColumnsOff), DEV_FormHelpers::addGridCtrlId2Set() ); // info( strfmt( @"%1 мс", DateTimeUtil::getDifference( DateTimeUtil::utcNow(), dateTimeStart ) * 10 ) ); } } X++: // дополнительное допиливание дизайна формы до инициализации protected void DEV_initDesignPre() { // ACHTUNG! Эта модификация к проблеме grid'ов никакого отношения не имеет! // опционально вертаем окна взад в рамки основного окна клиента (точнее, текущего workspace'а) if ( this.form().design().windowType() == FormWindowType::Standard && DEV_UserInfoParameters::find().DefaultFormWindowType == DEV_DefaultFormWindowType::Workspace ) { this.form().design().windowType( FormWindowType::Workspace ); } } X++: public void init() { // <GEEU> this.raiseEvent_W(methodstr(FormRunListener_W, beforeInit)); // </GEEU> this.DEV_initDesignPre(); // наши модификации super(); SysSecurityFormSetup::loadSecurity(this); this.dimensionFieldCtrls(); this.inventStorageDimFieldCtrls(); if (this.isWorkflowEnabled()) { workflowControls = SysWorkflowFormControls::construct(this); workflowControls.initControls(); } this.DEV_initDesignPost(); // наши модификации // <GEEU> this.raiseEvent_W(methodstr(FormRunListener_W, afterInit)); // </GEEU> } |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
14.09.2010, 12:41 | #28 |
Роман Долгополов (RDOL)
|
ок, постараюсь но согласитесь написано слегка неоднознано
ребята, не усложняйте без причин. не нужен крутой перфоратор и модные анкеры чтобы привесить картонку к фанерной стене на даче. достаточно обычного гвоздя и дедушкиного молотка |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
14.09.2010, 13:50 | #29 |
Участник
|
Цитата:
Если бы в Х++ была встроенная поддержка делегатов, не требующая разного рода костылей и игр с механизмами отражения, думаю, многи задачи решались бы с куда меньшими накладными расходами на кодирование и/или объемом copy-paste'а. |
|
15.09.2010, 08:34 | #30 |
Участник
|
Цитата:
|
|
22.09.2010, 19:09 | #31 |
Участник
|
До сих пор не замечал описанных в теме проблем. С какого примерно числа записей они должны начать проявляться?
|
|
22.09.2010, 19:21 | #32 |
Участник
|
У меня лично сложилось мнение, что дело не столько в количестве записей в таблице, сколько в количестве полей, отображаемых в Grid'е, и, если в нем есть поля на базе display/edit-методов, в скорости обсчета этих методов (которая, впрочем, может коррелировать с количеством записей в той или иной таблице ).
|
|
22.09.2010, 19:22 | #33 |
Участник
|
Например, в демо-данных на тестовом сервере (понятно, что не очень мощный) заметно торможение "из коробки". Особенно критично на таблицах с дисплей-полями. Например, в исходной теме из блога говорится о форме проводок по клиенту.
__________________
Ivanhoe as is.. |
|
23.09.2010, 07:13 | #34 |
Участник
|
не только дисплей-поля.
попробуйте обычный браузер таблиц. откройте его в стандартном варианте и с автоопределением ширины столбца. Цитата:
визуально - как только начинаются побочные эффекты с вертикальным скролбаром, так сразу отключение покажет эффект. Конечно же, автоопределение не зависит от скролбара. По-моему и проблемы со скорлбаром, и проблемы с автоопределением вызваны одной и той же причиной. |
|
23.09.2010, 12:36 | #35 |
Участник
|
Чего-то я ничего не вижу
Это свойство грида - autoSizeColumns? Не могу такого найти... |
|
23.09.2010, 12:42 | #36 |
Участник
|
это runtime-свойство.
|
|
23.09.2010, 18:12 | #37 |
Участник
|
Класс для проверки влияния autoSizeColumns() на время запуска форм
Цитата:
Возвращаясь к обозревателю, можно попробовать на двух таблицах: CustTrans и CustTransIdRef. Записей там должно быть одинаковое количество, при этом в CustTrans, в моем случае, более 100 полей, включая системные, в то время как в CustTransIdRef их всего 5. Впрочем, тут сложно отделить замедление, связанное с автоопределением ширины столбцов, от общего замедления, связанного с обработкой большего числа полей обозревателем. Во всяком случае, я лично отчетливо вижу разницу во времени открытия обозревателя для таблиц CustTrans и CustTransIdRef, однако, отключение автоопределения ширины столбцов для grid'ов формы обозревателя таблиц в моем случае не дает сколь-нибудь заметного ускорения. Цитата:
...В общем, для проверки влияния автоопределения ширины колонок на время открытия различных форм был написан небольшой класс. Ему при запуске (в коде main() - ибо класс написан на коленке) передается название формы либо идентификатор таблицы, которую надо открыть обозревателем. После этого класс эту форму в цикле открывает, ждет, пока клиент перейдет в состояние простоя, тут же форму закрывает и засекает, сколько времени (тиков) ушло с момента запуска. При этом основной цикл из ндцати открытий формы прогоняется дважды: сперва автоопределение ширины колонок отключается (в предположении, что используется приводившаяся мной доработка для SysSetupFormRun), а затем включается. У меня получились такие тестовые результаты: Код: Form 'SalesTable', autoSizeColumns( false ) 5159 ticks average per 10 times Form 'SalesTable', autoSizeColumns( true ) 6795 ticks average per 10 times Form 'SysTableBrowser' for LedgerJournalTrans, autoSizeColumns( false ) 2479 ticks average per 10 times Form 'SysTableBrowser' for LedgerJournalTrans, autoSizeColumns( true ) 2417 ticks average per 10 times |
|
|
За это сообщение автора поблагодарили: mazzy (5). |
23.09.2010, 19:38 | #38 |
Участник
|
Цитата:
отличный подход! респект. я всего-лишь на глаз мерял. при выключенной автоширине значительно быстрее. но завтра замеряю. эксперимент - критерий истины. |
|
13.02.2011, 18:23 | #39 |
Участник
|
"Не все йогурты одинаково полезны" :(
Цитата:
Если отредактировать ширину какого либо столбца руками, чтобы система запомнила настройки формы, то такого глюка не возникает. Последний раз редактировалось Daiver; 13.02.2011 в 18:31. |
|
13.02.2011, 18:56 | #40 |
Участник
|
Странно.
По идее эта опция на грид целиком должна влиять. |
|
Теги |
ax2009, grid, syssetupformrun, грид, законченный пример, полезное, производительность, ширина |
|
|