OberonCore https://forum.oberoncore.ru/ |
|
Тормоза виндовых контролов https://forum.oberoncore.ru/viewtopic.php?f=24&t=4034 |
Страница 1 из 1 |
Автор: | Иван Кузьмицкий [ Суббота, 28 Июль, 2012 15:47 ] |
Заголовок сообщения: | Тормоза виндовых контролов |
Простой тест. На форме размещается десяток дропов, каждый из которых заполняется несколькими десятками записей. Открытие такой формы у меня занимает 370 мсек, а обновление через Dialog.UpdateList - 655 мсек. И это всего лишь 10 контролов. Мы всегда подозревали, что использование виндовых контролов в ББ дело зело тормозное, ну а приведённый пример являет собой зрелище просто душераздирающее, как говорил Иа. Код: MODULE PrivBenchmark;
IMPORT Services, StdLog, StdCmds, Dialog, Ports, Strings, Controls, Views,FormModels, FormViews; VAR global*: RECORD drop*: ARRAY 10 OF Dialog.List; END; PROCEDURE InitProp (VAR p: Controls.Prop); BEGIN NEW(p); p.link := ""; p.label := ""; p.guard := ""; p.notifier := ""; p.level := 0; p.opt[0] := FALSE; p.opt[1] := FALSE; p.opt[2] := FALSE; p.opt[3] := FALSE; p.opt[4] := FALSE END InitProp; PROCEDURE NewDrop (i: INTEGER): Views.View; VAR prop: Controls.Prop; s: ARRAY 10 OF CHAR; BEGIN InitProp(prop); Strings.IntToString(i, s); prop.link := 'PrivBenchmark.global.drop['+s+']'; RETURN Controls.dir.NewListBox(prop) END NewDrop; (* Проверка скорости работы Dialog.UpdateList; *) PROCEDURE Do1*; VAR m: FormModels.Model; i, j, x, y: INTEGER; ticks: LONGINT; BEGIN m := FormModels.dir.New(); FOR i := 0 TO 9 DO FOR j := 0 TO 30 DO global.drop[i].SetItem(j, 'Есть только миг') END; x := 0; y := i * 6*Ports.mm; m.Insert(NewDrop(i), x, y, x + 50*Ports.mm, y + 6*Ports.mm); END; ticks := Services.Ticks(); Views.OpenView(FormViews.dir.New(m)); StdLog.String('Форма с дропами открылась за '); StdLog.Int((Services.Ticks()-ticks)); StdLog.String(' миллисекунд'); StdLog.Ln; ticks := Services.Ticks(); FOR i := 0 TO 9 DO Dialog.UpdateList(global.drop[i]) END; StdLog.String('Дропы обновились за '); StdLog.Int((Services.Ticks()-ticks)); StdLog.String(' миллисекунд'); StdCmds.SetMaskMode; StdLog.Ln; END Do1; END PrivBenchmark. PrivBenchmark.Do1; |
Автор: | Иван Денисов [ Воскресенье, 29 Июль, 2012 18:45 ] |
Заголовок сообщения: | Re: Тормоза виндовых контролов |
Код: компилируется "PrivBenchmark" Тест на Ubuntu 12.04 Wine 1.4 Intel® Core™ i5 CPU M 460 @ 2.53GHz × 4
новый символьный файл 680 320 Форма с дропами открылась за 96 миллисекунд Дропы обновились за 21 миллисекунд Форма с дропами открылась за 98 миллисекунд Дропы обновились за 43 миллисекунд Форма с дропами открылась за 98 миллисекунд Дропы обновились за 57 миллисекунд |
Автор: | Alexey_Donskoy [ Среда, 01 Август, 2012 13:30 ] |
Заголовок сообщения: | Re: Тормоза виндовых контролов |
Иван Денисов писал(а): Тест на ... Intel® Core™ i5 CPU M 460 @ 2.53GHz × 4 Мнение старого ассемблерщика: если программа тормозит на БК-0010, то это неэффективно написанная программа. А у Вас тут вообще такие ресурсы астрономические... |
Автор: | Пётр Кушнир [ Среда, 01 Август, 2012 14:34 ] |
Заголовок сообщения: | Re: Тормоза виндовых контролов |
вайн не в счет, я думаю |
Автор: | Иван Кузьмицкий [ Среда, 01 Август, 2012 14:59 ] |
Заголовок сообщения: | Re: Тормоза виндовых контролов |
На XP оно вроде бы быстро крутится, а вот на 7-ке тормозит. На вайне и XP замеры не проводил, оценка чисто субъективная. |
Автор: | Роман М. [ Четверг, 02 Август, 2012 10:55 ] |
Заголовок сообщения: | Re: Тормоза виндовых контролов |
Wine 1.2.3, NVidia GeForce 7300 GT Цитата: Форма с дропами открылась за 82 миллисекунд В XP, запущенной на виртуальной машине, за десяток вызовов время обновления превысило 1 секунду.Дропы обновились за 19 миллисекунд Форма с дропами открылась за 86 миллисекунд Дропы обновились за 20 миллисекунд Форма с дропами открылась за 80 миллисекунд Дропы обновились за 39 миллисекунд Форма с дропами открылась за 46 миллисекунд Дропы обновились за 55 миллисекунд Форма с дропами открылась за 43 миллисекунд Дропы обновились за 74 миллисекунд Форма с дропами открылась за 80 миллисекунд Дропы обновились за 93 миллисекунд Форма с дропами открылась за 46 миллисекунд Дропы обновились за 111 миллисекунд Форма с дропами открылась за 79 миллисекунд Дропы обновились за 132 миллисекунд Форма с дропами открылась за 83 миллисекунд Дропы обновились за 149 миллисекунд Форма с дропами открылась за 46 миллисекунд Дропы обновились за 170 миллисекунд На основании этих результатов делаю вывод, что на время перерисовки дропов влияет количество открытых форм. Если каждую открытую форму сразу же закрывать, то с увеличением вызовов время открытия увеличиваться не станет. Грешу на реализацию фреймворка ББ. |
Автор: | Иван Кузьмицкий [ Четверг, 02 Август, 2012 12:36 ] |
Заголовок сообщения: | Re: Тормоза виндовых контролов |
У меня на том же компе, только на Убунте 11.04, в вайне 1.2.2, картина следующая: Цитата: Форма с дропами открылась за 78 миллисекунд Дропы обновились за 38 миллисекунд Если подряд открыть несколько форм, не закрывая их, то задержка слегка увеличивается: Цитата: Форма с дропами открылась за 79 миллисекунд Дропы обновились за 63 миллисекунд Форма с дропами открылась за 80 миллисекунд Дропы обновились за 93 миллисекунд Форма с дропами открылась за 72 миллисекунд Дропы обновились за 108 миллисекунд Так что это особенности реализации Windows API. В общем-то, предсказуемо. |
Автор: | Роман М. [ Четверг, 02 Август, 2012 22:12 ] |
Заголовок сообщения: | Re: Тормоза виндовых контролов |
Иван Кузьмицкий писал(а): Так что это особенности реализации Windows API. В общем-то, предсказуемо. Чем обосновано такое заключение?
|
Автор: | Иван Кузьмицкий [ Пятница, 03 Август, 2012 08:05 ] |
Заголовок сообщения: | Re: Тормоза виндовых контролов |
Роман М. писал(а): Иван Кузьмицкий писал(а): Так что это особенности реализации Windows API. В общем-то, предсказуемо. Чем обосновано такое заключение?Контролы в ББ используют Windows API. Конкретные вызовы можно легко проследить по исходникам HostCFrames. Один и тот же ББ, один и тот же код, по-разному работает на разных платформах - wine\xp или win7. Из чего можно сделать вывод, что на разных платформах по-разному реализуется API. В общем-то, это очевидно, ведь нельзя сказать, что реализация wine-winapi совпадает на 100% с реализацией winapi на windows 7. |
Автор: | Роман М. [ Пятница, 03 Август, 2012 20:01 ] |
Заголовок сообщения: | Re: Тормоза виндовых контролов |
Иван Кузьмицкий писал(а): Роман М. писал(а): Иван Кузьмицкий писал(а): Так что это особенности реализации Windows API. В общем-то, предсказуемо. Чем обосновано такое заключение?Контролы в ББ используют Windows API. Конкретные вызовы можно легко проследить по исходникам HostCFrames. Один и тот же ББ, один и тот же код, по-разному работает на разных платформах - wine\xp или win7. Из чего можно сделать вывод, что на разных платформах по-разному реализуется API. В общем-то, это очевидно, ведь нельзя сказать, что реализация wine-winapi совпадает на 100% с реализацией winapi на windows 7. И как же объясняется увеличение времени прорисовки элементов форм с увеличением количества форм? Почему это взаимосвязано? |
Автор: | Иван Кузьмицкий [ Пятница, 03 Август, 2012 20:20 ] |
Заголовок сообщения: | Re: Тормоза виндовых контролов |
Роман М. писал(а): И как же объясняется увеличение времени прорисовки элементов форм с увеличением количества форм? Почему это взаимосвязано? Я не знаю, почему контролы тормозят! У меня есть только предположение, что ББ использует какие-то механизмы, которые в винде с течением времени были немного модернизированы.Да, в общем-то, не сильно это важно, что там внутри тормозит. Надо делать свои контролы, так оно надёжнее. |
Автор: | Иван Денисов [ Пятница, 03 Август, 2012 20:35 ] |
Заголовок сообщения: | Re: Тормоза виндовых контролов |
Если закомментить код в HostCFrames.ListUpdate Код: PROCEDURE (f: ListBox) UpdateList; То 500 ! выпадающих списков обновляются за 5-6 мс. Поэтому как бы не хотелось опорочить ББ, он видимо действительно не при чем. Вчистую тормоза WinApi, да и не так уж это и быстро по идее, поскольку он заново пересоздает все списки.
VAR res, i: INTEGER; s: Dialog.String; BEGIN (* IF f.i.dropDown THEN res := WinApi.SendMessageW(f.i.ctrl, WinApi.CB_RESETCONTENT, 0, 0); i := 0; f.GetName(f, i, s); Dialog.MapString(s, s); ConvertFromUnicode(s); WHILE s # "" DO res := WinApi.SendMessageW(f.i.ctrl, WinApi.CB_ADDSTRING, 0, SYSTEM.ADR(s)); res := WinApi.SendMessageW(f.i.ctrl, WinApi.CB_SETITEMDATA, res, i); INC(i); f.GetName(f, i, s); Dialog.MapString(s, s); ConvertFromUnicode(s); END; Adapt(f, f.i) ELSE res := WinApi.SendMessageW(f.i.ctrl, WinApi.LB_RESETCONTENT, 0, 0); i := 0; f.GetName(f, i, s); Dialog.MapString(s, s); ConvertFromUnicode(s); WHILE s # "" DO res := WinApi.SendMessageW(f.i.ctrl, WinApi.LB_ADDSTRING, 0, SYSTEM.ADR(s)); res := WinApi.SendMessageW(f.i.ctrl, WinApi.LB_SETITEMDATA, res, i); INC(i); f.GetName(f, i, s); Dialog.MapString(s, s); ConvertFromUnicode(s); END END; *) f.Update END UpdateList; |
Автор: | Пётр Кушнир [ Пятница, 03 Август, 2012 21:10 ] |
Заголовок сообщения: | Re: Тормоза виндовых контролов |
Роман М. писал(а): И как же объясняется увеличение времени прорисовки элементов форм с увеличением количества форм? Почему это взаимосвязано? Это объясняется широковещательным обновлением Dialog.UpdateList(VAR x: ANYREC), которое с каждой новой формой для каждого контрола, для которого x является интерактором, посылает UpdateMsg по дереву фреймов. А ещё, емнип, обновление такое какими-то контролами интерпретировалось всегда, то есть, даже контролы чужого интерактора обновлялись по этому сообщению. По памяти не скажу, где такое обсуждалось. |
Автор: | Александр Ильин [ Суббота, 04 Август, 2012 02:22 ] |
Заголовок сообщения: | Re: Тормоза виндовых контролов |
Иван Денисов писал(а): Поэтому как бы не хотелось опорочить ББ, он видимо действительно не при чем. Вчистую тормоза WinApi... Так уж и ни при чем? А на кой, спрашивается, пересоздавать все списки каждый раз?
|
Автор: | Иван Денисов [ Суббота, 04 Август, 2012 09:27 ] |
Заголовок сообщения: | Re: Тормоза виндовых контролов |
Александр Ильин писал(а): Иван Денисов писал(а): Поэтому как бы не хотелось опорочить ББ, он видимо действительно не при чем. Вчистую тормоза WinApi... Так уж и ни при чем? А на кой, спрашивается, пересоздавать все списки каждый раз?Александр, а как организовано обновление содержимого выпадающих списков в Amadeus? |
Автор: | Иван Кузьмицкий [ Суббота, 04 Август, 2012 10:16 ] |
Заголовок сообщения: | Re: Тормоза виндовых контролов |
Дело не совсем в UpdateList, а в наличии фрейма, через который просвечивает виндовый контрол. Перерисовку самого контрола операционная система делает с некоторой задержкой и эта задержка тормозит перерисовку всего гуя в ББ. Тема обсуждалась тут: viewtopic.php?f=24&t=3333&hilit=%D0%BC%D0%B5%D1%80%D1%86%D0%B0%D0%BD%D0%B8%D0%B5 |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |