OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Вторник, 19 Март, 2024 08:27

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 16 ] 
Автор Сообщение
 Заголовок сообщения: Тормоза виндовых контролов
СообщениеДобавлено: Суббота, 28 Июль, 2012 15:47 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Простой тест. На форме размещается десяток дропов, каждый из которых заполняется несколькими десятками записей.

Открытие такой формы у меня занимает 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;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тормоза виндовых контролов
СообщениеДобавлено: Воскресенье, 29 Июль, 2012 18:45 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Код:
компилируется "PrivBenchmark"
  новый символьный файл   680   320
Форма с дропами открылась за  96 миллисекунд
Дропы обновились за  21 миллисекунд
Форма с дропами открылась за  98 миллисекунд
Дропы обновились за  43 миллисекунд
Форма с дропами открылась за  98 миллисекунд
Дропы обновились за  57 миллисекунд
Тест на Ubuntu 12.04 Wine 1.4 Intel® Core™ i5 CPU M 460 @ 2.53GHz × 4


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тормоза виндовых контролов
СообщениеДобавлено: Среда, 01 Август, 2012 13:30 
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тормоза виндовых контролов
СообщениеДобавлено: Среда, 01 Август, 2012 14:34 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
вайн не в счет, я думаю


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тормоза виндовых контролов
СообщениеДобавлено: Среда, 01 Август, 2012 14:59 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
На XP оно вроде бы быстро крутится, а вот на 7-ке тормозит. На вайне и XP замеры не проводил, оценка чисто субъективная.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тормоза виндовых контролов
СообщениеДобавлено: Четверг, 02 Август, 2012 10:55 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
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 секунду.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тормоза виндовых контролов
СообщениеДобавлено: Четверг, 02 Август, 2012 12:36 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
У меня на том же компе, только на Убунте 11.04, в вайне 1.2.2, картина следующая:

Цитата:
Форма с дропами открылась за 78 миллисекунд
Дропы обновились за 38 миллисекунд


Если подряд открыть несколько форм, не закрывая их, то задержка слегка увеличивается:

Цитата:
Форма с дропами открылась за 79 миллисекунд
Дропы обновились за 63 миллисекунд
Форма с дропами открылась за 80 миллисекунд
Дропы обновились за 93 миллисекунд
Форма с дропами открылась за 72 миллисекунд
Дропы обновились за 108 миллисекунд


Так что это особенности реализации Windows API. В общем-то, предсказуемо.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тормоза виндовых контролов
СообщениеДобавлено: Четверг, 02 Август, 2012 22:12 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Иван Кузьмицкий писал(а):
Так что это особенности реализации Windows API. В общем-то, предсказуемо.
Чем обосновано такое заключение?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тормоза виндовых контролов
СообщениеДобавлено: Пятница, 03 Август, 2012 08:05 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Роман М. писал(а):
Иван Кузьмицкий писал(а):
Так что это особенности реализации Windows API. В общем-то, предсказуемо.
Чем обосновано такое заключение?


Контролы в ББ используют Windows API. Конкретные вызовы можно легко проследить по исходникам HostCFrames. Один и тот же ББ, один и тот же код, по-разному работает на разных платформах - wine\xp или win7. Из чего можно сделать вывод, что на разных платформах по-разному реализуется API. В общем-то, это очевидно, ведь нельзя сказать, что реализация wine-winapi совпадает на 100% с реализацией winapi на windows 7.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тормоза виндовых контролов
СообщениеДобавлено: Пятница, 03 Август, 2012 20:01 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Иван Кузьмицкий писал(а):
Роман М. писал(а):
Иван Кузьмицкий писал(а):
Так что это особенности реализации Windows API. В общем-то, предсказуемо.
Чем обосновано такое заключение?


Контролы в ББ используют Windows API. Конкретные вызовы можно легко проследить по исходникам HostCFrames. Один и тот же ББ, один и тот же код, по-разному работает на разных платформах - wine\xp или win7. Из чего можно сделать вывод, что на разных платформах по-разному реализуется API. В общем-то, это очевидно, ведь нельзя сказать, что реализация wine-winapi совпадает на 100% с реализацией winapi на windows 7.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тормоза виндовых контролов
СообщениеДобавлено: Пятница, 03 Август, 2012 20:20 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Роман М. писал(а):
И как же объясняется увеличение времени прорисовки элементов форм с увеличением количества форм? Почему это взаимосвязано?
Я не знаю, почему контролы тормозят! У меня есть только предположение, что ББ использует какие-то механизмы, которые в винде с течением времени были немного модернизированы.

Да, в общем-то, не сильно это важно, что там внутри тормозит. Надо делать свои контролы, так оно надёжнее.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тормоза виндовых контролов
СообщениеДобавлено: Пятница, 03 Август, 2012 20:35 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Если закомментить код в 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, да и не так уж это и быстро по идее, поскольку он заново пересоздает все списки.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тормоза виндовых контролов
СообщениеДобавлено: Пятница, 03 Август, 2012 21:10 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Роман М. писал(а):
И как же объясняется увеличение времени прорисовки элементов форм с увеличением количества форм? Почему это взаимосвязано?

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тормоза виндовых контролов
СообщениеДобавлено: Суббота, 04 Август, 2012 02:22 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Иван Денисов писал(а):
Поэтому как бы не хотелось опорочить ББ, он видимо действительно не при чем. Вчистую тормоза WinApi...
Так уж и ни при чем? А на кой, спрашивается, пересоздавать все списки каждый раз?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тормоза виндовых контролов
СообщениеДобавлено: Суббота, 04 Август, 2012 09:27 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Александр Ильин писал(а):
Иван Денисов писал(а):
Поэтому как бы не хотелось опорочить ББ, он видимо действительно не при чем. Вчистую тормоза WinApi...
Так уж и ни при чем? А на кой, спрашивается, пересоздавать все списки каждый раз?
UpdateList предполагает пересоздание списка, ведь его содержимое изменилось, во и пересоздает. Смотрите код из CFrames выше. А должен обращаться в WinApi только если изменилось что-то? ИМХО, зная теперь такие особенности, программист уже не будет вызывать постоянно такую дорогостоящую операцию, а делать какую-нибудь быструю предпроверку целесообразности обновления.

Александр, а как организовано обновление содержимого выпадающих списков в Amadeus?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тормоза виндовых контролов
СообщениеДобавлено: Суббота, 04 Август, 2012 10:16 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Дело не совсем в UpdateList, а в наличии фрейма, через который просвечивает виндовый контрол. Перерисовку самого контрола операционная система делает с некоторой задержкой и эта задержка тормозит перерисовку всего гуя в ББ. Тема обсуждалась тут: viewtopic.php?f=24&t=3333&hilit=%D0%BC%D0%B5%D1%80%D1%86%D0%B0%D0%BD%D0%B8%D0%B5


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 16 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB