![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Оптимизация скорости вывода на екран с помощью Label [D7, XP]
GVas © (2009-01-04 14:53:00)Добрый день.
На форме вывожу информацию вот так
procedure TForm1.Button1Click(Sender: TObject);
var
i:Integer;
begin
For i:=1 to 100000 do
Begin
Label1.Caption:=IntToStr(i);
Label1.Refresh;
End;
end;
оптимальна ли с точки быстродействия такая конструкция, потому как на довольно мощном компе такая по сути простая операция занимает довольно много времени (8 секунд где-то (или 200000 тактов процессора на одно обновление значения)) и заметил что в некоторых случаях загружаются разные ядра процессора (но одновременно только одно). Спасибо за ответы.
AndreyV (2009-01-04 18:00:00) [41]> [8] GVas © (04.01.09 17:53)
Раз в неделю появляется этот вопрос
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=374
GVas (2009-01-04 17:53:00) [42]Мдя, все извините за беспокойство оказалось что real48 мало знаков в числе поддерживает, значит ли это что если прибавлять к очень большому числу очень маленькое, будет погрешность??
GVas (2009-01-04 17:47:00) [43]Вот решил проверить как работает математика в делфе взял вещественное число 1Е-17 прибавил его 100000 раз получается 9,99999988197267E-13 а должно быть 1е-12 почему такая разница получается????
{RASkov} (2009-01-04 17:30:00) [44]> а такая же функция для вещественных чисел присутствует??
Да, FloatToStr()
> нельзя нажать на какую либо другую кнопку, как выйти из
> такого положения?
Application.Processmessage;
или доппотоки....
GVas (2009-01-04 17:26:00) [45]Спасибо за ответ, все понятно, но если можно еще один вопрос есть IntToStr а такая же функция для вещественных чисел присутствует?? и еще момент при работе цикла нельзя нажать на какую либо другую кнопку, как выйти из такого положения?
AndreyV (2009-01-04 16:47:00) [46]> [3] sniknik © (04.01.09 16:34)
Кстати, и 0.5 секунд для лейбл, а тем более для "пары сотен", - слишком часто, тут надо стрелки рисовать.
sniknik (2009-01-04 16:34:00) [47]> или я занимаюсь ерундой
занимаешься ерундой, но вовсе не из за скоростей процессора, а из-за того что пытаешься оптимизировать то, что в этом не нуждается... ->
лебел, как и другие компоненты предназначенные для отображения, они для юзера, т.е. чтобы юзер видел инфу, а юзер физически не может реагировать так быстро... т.е. достаточно выводить только то что он способен заметить и осознать, и если инфа будет меняться раз в пол секунды этого будет достаточно... и для этого на всю твою проверку достаточен всего 1 вызов (и он останется одним даже если цикл еще на пару порядков увеличить)... и какая нужна оптимизация одного вызова? а она реально нужна в данном случае всего одна при правильной логике.
понятно что у тебя там будут еще вычисления, но... какую долю времени займут обновления интерфейса. если отображать только достаточное для юзера?
вот например чтобы вызвать 100000 раз (в нормальном варианте) у тебя вычисления должны идти 14 часов... и что в этой доле будут занимать 8 сек?
GVas (2009-01-04 16:03:00) [48]ну мб я просто неправильно выразил мысль но существует ли в делфи способ вывода на экран отличный от Label, но работающий быстрее брал я 100000 просто для того чтобы приблизительно высчитать скорость вывода на экран и даже если взять Label1.Caption:=IntToStr(100000) то это получатся почти те же самые 200к тактов процесора (чуть меньше) а если программа каждую секунду обновляет пару сотен таких Label и перед этим обсчитывает какие-то головоломные масивы информации хотелось бы немного оптимизировать работу. Подскажите, или я занимаюсь ерундой и на нынешних скоростях процессора это будет не очень заметно?
sniknik (2009-01-04 15:08:00) [49]> оптимальна ли с точки быстродействия такая конструкция
а подумать? ты там все цифры разглядеть успеваешь?
> 8 секунд
а вот такая
procedure TForm1.Button1Click(Sender: TObject);
var
i:Integer;
begin
For i:=1 to 100000 do
Begin
//Label1.Caption:=IntToStr(i);
//Label1.Refresh;
End;
Label1.Caption:=IntToStr(100000);
end;
0 сек. при том же конечном результате.