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"
  новый символьный файл   680   320
Форма с дропами открылась за  96 миллисекунд
Дропы обновились за  21 миллисекунд
Форма с дропами открылась за  98 миллисекунд
Дропы обновились за  43 миллисекунд
Форма с дропами открылась за  98 миллисекунд
Дропы обновились за  57 миллисекунд
Тест на Ubuntu 12.04 Wine 1.4 Intel® Core™ i5 CPU M 460 @ 2.53GHz × 4

Автор:  Alexey_Donskoy [ Среда, 01 Август, 2012 13:30 ]
Заголовок сообщения:  Re: Тормоза виндовых контролов

Иван Денисов писал(а):
Тест на ... Intel® Core™ i5 CPU M 460 @ 2.53GHz × 4
Мнение старого ассемблерщика: если программа тормозит на БК-0010, то это неэффективно написанная программа. :wink:
А у Вас тут вообще такие ресурсы астрономические...

Автор:  Пётр Кушнир [ Среда, 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 миллисекунд
Дропы обновились за 19 миллисекунд
Форма с дропами открылась за 86 миллисекунд
Дропы обновились за 20 миллисекунд
Форма с дропами открылась за 80 миллисекунд
Дропы обновились за 39 миллисекунд
Форма с дропами открылась за 46 миллисекунд
Дропы обновились за 55 миллисекунд
Форма с дропами открылась за 43 миллисекунд
Дропы обновились за 74 миллисекунд
Форма с дропами открылась за 80 миллисекунд
Дропы обновились за 93 миллисекунд
Форма с дропами открылась за 46 миллисекунд
Дропы обновились за 111 миллисекунд
Форма с дропами открылась за 79 миллисекунд
Дропы обновились за 132 миллисекунд
Форма с дропами открылась за 83 миллисекунд
Дропы обновились за 149 миллисекунд
Форма с дропами открылась за 46 миллисекунд
Дропы обновились за 170 миллисекунд
В XP, запущенной на виртуальной машине, за десяток вызовов время обновления превысило 1 секунду.

На основании этих результатов делаю вывод, что на время перерисовки дропов влияет количество открытых форм. Если каждую открытую форму сразу же закрывать, то с увеличением вызовов время открытия увеличиваться не станет. Грешу на реализацию фреймворка ББ.

Автор:  Иван Кузьмицкий [ Четверг, 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;
      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;
То 500 ! выпадающих списков обновляются за 5-6 мс. Поэтому как бы не хотелось опорочить ББ, он видимо действительно не при чем. Вчистую тормоза WinApi, да и не так уж это и быстро по идее, поскольку он заново пересоздает все списки.

Автор:  Пётр Кушнир [ Пятница, 03 Август, 2012 21:10 ]
Заголовок сообщения:  Re: Тормоза виндовых контролов

Роман М. писал(а):
И как же объясняется увеличение времени прорисовки элементов форм с увеличением количества форм? Почему это взаимосвязано?

Это объясняется широковещательным обновлением Dialog.UpdateList(VAR x: ANYREC), которое с каждой новой формой для каждого контрола, для которого x является интерактором, посылает UpdateMsg по дереву фреймов. А ещё, емнип, обновление такое какими-то контролами интерпретировалось всегда, то есть, даже контролы чужого интерактора обновлялись по этому сообщению. По памяти не скажу, где такое обсуждалось.

Автор:  Александр Ильин [ Суббота, 04 Август, 2012 02:22 ]
Заголовок сообщения:  Re: Тормоза виндовых контролов

Иван Денисов писал(а):
Поэтому как бы не хотелось опорочить ББ, он видимо действительно не при чем. Вчистую тормоза WinApi...
Так уж и ни при чем? А на кой, спрашивается, пересоздавать все списки каждый раз?

Автор:  Иван Денисов [ Суббота, 04 Август, 2012 09:27 ]
Заголовок сообщения:  Re: Тормоза виндовых контролов

Александр Ильин писал(а):
Иван Денисов писал(а):
Поэтому как бы не хотелось опорочить ББ, он видимо действительно не при чем. Вчистую тормоза WinApi...
Так уж и ни при чем? А на кой, спрашивается, пересоздавать все списки каждый раз?
UpdateList предполагает пересоздание списка, ведь его содержимое изменилось, во и пересоздает. Смотрите код из CFrames выше. А должен обращаться в 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/