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




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 2317 • Страница 89 из 116<  1 ... 86  87  88  89  90  91  92 ... 116  >
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Member
Статус: Не в сети
Регистрация: 02.12.2004
Shader 3.0
У меня расчет занял 43 секунды на неразогнанном Athlon 3200+ (2Ghz)
Оперативки 1.5Gb
Компилировал с помощью BDS 2006 (Update 2 HotFix RollUp10)

оптимизировал твою прогу, стала считать за 203 милисекунды....
Все что я сделал заменил вызов Memo1.Lines.Count на переменную :)

http://cp.people.overclockers.ru/cgi-bi ... e=3_mod.7z (Размер: 197.7 Кбайт)



Партнер
 

Member
Статус: Не в сети
Регистрация: 08.11.2005
Куда там SuperPi, ща новый бенч придумаем.
Рабочий комп:
Цитата:
Asus P5AD2-E Deluxe i925XE Lga775 [Stock]
Pentium 4 3000MHz(15x200) Prescott-2M [Box]
Corsair 2x256Mb 533MHz
Win XP SP2

Delphi 7 - 98 сек
BDE 2006 - 101 сек

Домашний комп №1:
Цитата:
EPoX 9NPAJ nF4SLi Soc939 [Titan TTC-CUV2]
A64x2 4600+ 2400@2748MHz(12x229) Toledo [TT Big Typhoon]
Hynix 2x1024Mb 400@458MHz 3-3-3-8-2T
Win XP SP2

Delphi 7 - 46 сек
BDE 2006 - 46 сек

Домашний комп №2:
Цитата:
EPoX 9NPA3J nF4 Soc939 [Titan TTC-CUV2]
A64 3800+ 2400MHz(12x200) Venice [Zamlan 7000Cu]
NCP 2x512Mb 400MHz 3-3-3-8-1T
Win 2003

Delphi 7 - 21 сек
BDE 2006 - 21 сек

Размеры EXE Delphi 7 - 409Кб
Размеры EXE BDE 2006 - 440Кб

Больше всего удивили резутьтаты на втором домашнем компе.

_________________
AM4/B550-F/5950X/128Gb/4070S/4x4Tb NVMe


 

Member
Статус: Не в сети
Регистрация: 16.04.2006
Откуда: d3d9.dll
Фото: 7
Xupyp1 писал(а):
оптимизировал твою прогу, стала считать за 203 милисекунды....Все что я сделал заменил вызов Memo1.Lines.Count на переменную

Вот спасибо, друг. :beer: Даже и не мог себе представить, что из-за этого постоянного подсчета Memo1.Lines.Count программа могла так тормозить. :oops: Сейчас тоже так сделал - заменил Memo1.Lines.Count на переменную (а твой исходник что-то так и не смог скачать). Сейчас ещё чуть оптимизнул - массивы сделал динамическими. На скорость подсчета это не повлияло, но зато программа вроде стала кушать поменьше памяти.
Xupyp1 писал(а):
У меня расчет занял 43 секунды на неразогнанном Athlon 3200+ (2Ghz)Оперативки 1.5Gb
Компилировал с помощью BDS 2006 (Update 2 HotFix RollUp10)

Интересный результат, почти как на "A64x2 4600+ 2400@2748MHz(12x229) Toledo"
Mike3000 писал(а):
Больше всего удивили резутьтаты на втором домашнем компе.

Действительно впечатляет. Значит получается что от версий Delphi/компилятора результат расчета не зависит.
P. S. А вот Пентиумы явно недолюбливают однооборазный подсчет числа строк в Memo. :)


 

Member
Статус: Не в сети
Регистрация: 08.11.2005
Видать к Win2k3 дельфа достаточна благосклонна, или к CR 1T....

_________________
AM4/B550-F/5950X/128Gb/4070S/4x4Tb NVMe


 

Member
Статус: Не в сети
Регистрация: 03.01.2004
Откуда: Питер
Shader 3.0 убери из кода расчета ВСЕ обращения к визуальным компонентам. Если оные присутствуют в каких-то циклах, то эта оптимизация позволит выиграть очень много.

_________________
Здесь так мало тех, с кем легко говорить,
Еще меньше тех, с кем не страшно молчать (c)


 

Member
Статус: Не в сети
Регистрация: 16.04.2006
Откуда: d3d9.dll
Фото: 7
Lord_of_Darkness, спасибо я уже понял. Теперь возьму за правило не использовать в циклах подобные обращения.


 

Member
Статус: Не в сети
Регистрация: 08.11.2005
Lord_of_Darkness писал(а):
Shader 3.0 убери из кода расчета ВСЕ обращения к визуальным компонентам

Если уж на то пошло, то и не только к визуальным. Напр TADOTable.RecordCount и пр. тоже лучше сохранять в переменную.

_________________
AM4/B550-F/5950X/128Gb/4070S/4x4Tb NVMe


 

Shader 3.0 писал(а):
Сейчас ещё чуть оптимизнул - массивы сделал динамическими
Можно про динамические массивы поподробнее. Просто при написании программ очень не удобно использовать массивы, ввиду того что не известно сколько понадобится элементов. Если не трудно, приведите маленький пример с динамическими массивами.


 

Member
Статус: Не в сети
Регистрация: 08.11.2005
GN писал(а):
Можно про динамические массивы поподробнее. Просто при написании программ очень не удобно использовать массивы, ввиду того что не известно сколько понадобится элементов. Если не трудно, приведите маленький пример с динамическими массивами.

Код:
//определение
var as: array of string;
//установка размера
SetLength(as,20);
//вернуть размер
xx:=Length(as);
//цикл
var i: integer;
for i:=0 to Length(as)-1 do
  showmessage(as[i]);
//Уменьшить размер на 4
SetLength(as,Length(as)-4);

_________________
AM4/B550-F/5950X/128Gb/4070S/4x4Tb NVMe


 

Member
Статус: Не в сети
Регистрация: 23.12.2004
Откуда: Беларусь, Минск
Mike3000
И ещё немного оптимизации (вот тут правда, AFAIR... но скорее всего правда)
лучше не так
Код:
var i: integer;
for i:=0 to Length(as)-1 do

а так
Код:
var i, sub_i: integer;
 sub_i:=Length(as)-1;
for i:=0 to sub_i do

Т.к. по-моему при каждом проходе вызывается процедура определения длинны Ленх... а это несколько дольше чем просто сравнить с числом.

_________________
ASUS A4M88T-M, Athlon II X3 425, 2GB NCP, video - internal ATI 4250, 200GB Samsung HDD, Win7 x64


 

Member
Статус: Не в сети
Регистрация: 16.04.2006
Откуда: d3d9.dll
Фото: 7
GN писал(а):
Можно про динамические массивы поподробнее. Просто при написании программ очень не удобно использовать массивы, ввиду того что не известно сколько понадобится элементов.

Я смотрю вам уже ответили. Действительно динамические массивы очень удобная вещь, как раз из-за того что при их объявлении не надо указывать их длину (т. к. длина таких массивов может изменяться). Кстати узнать количество элементов в массиве можно ещё и с помощью функции High(a), где a - переменная типа массив (в т. ч. и динамический).


 

Большое спасибо за помощь.


 

Member
Статус: Не в сети
Регистрация: 08.11.2005
AzaZeo писал(а):
Т.к. по-моему при каждом проходе вызывается процедура определения длинны Ленх... а это несколько дольше чем просто сравнить с числом.

Полностью согласен, хотя много на этом не выиграешь.

Shader 3.0 писал(а):
Я смотрю вам уже ответили. Действительно динамические массивы очень удобная вещь, как раз из-за того что при их объявлении не надо указывать их длину

Но динамические массивы будут чуть медленнее, чем статические. Хотя это тоже практически незаметно.

Shader 3.0 писал(а):
Кстати узнать количество элементов в массиве можно ещё и с помощью функции High(a), где a - переменная типа массив (в т. ч. и динамический).

Немного не верно. High - возвращает последнее значение в диапазоне номеров элементов, а Low соотв. первое. Сумбурно объяснил. Напр:
Код:
//может использоваться в цикле
var i: integer;
for i:=Low(aos) to High(aos) do
  showmessage(aos[i]);
,где массив может быть объявлен как:
var aos: array[-4..5] of string;
соотв:
Low(aos)=-4
High(aos)=5

_________________
AM4/B550-F/5950X/128Gb/4070S/4x4Tb NVMe


 

Member
Статус: Не в сети
Регистрация: 19.10.2004
Откуда: Москва, СВАО
Помогите пожалуйста моему другу с курсовой - найти ошибку.
Задание:
Нужно в каждом пикселе посчитать кол-во красного, зелёного и соответственно синего цветов (выводить эту информацию не надо)),
потом узнать в каком пикселе какой из этих 3 цветов преобладает и закрасить этот пиксель в этот цвет...

Он написал программу, но она красит всё в красный)
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtDlgs, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Image1: TImage;
    OpenPictureDialog1: TOpenPictureDialog;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
if openpicturedialog1.Execute then
image1.Picture.LoadFromFile(openpicturedialog1.FileName);
end;

function RgbToRed(RGBColor: TColor): TColor;
var
  Red: byte;
begin
  Red := GetRValue(RGBColor);
  Result := RGB(Red, 0, 0);
end;

function RgbToGre(RGBColor: TColor): TColor;
var
  Gre: byte;
begin
  Gre := GetGValue(RGBColor);
  Result := RGB(0, Gre, 0);
end;

function RgbToBlu(RGBColor: TColor): TColor;
var
  Blu: byte;
begin
  Blu := GetBValue(RGBColor);
  Result := RGB(0, 0, Blu);
end;



procedure TForm1.Button2Click(Sender: TObject);
var
  h, w: integer;
  Red: byte;
  Gre: byte;
  Blu: byte;
begin
  for w := 0 to Image1.Width-1 do
    for h := 0 to Image1.Height-1 do

if (Red > Gre) and (Red > Blu) then
Image1.Canvas.Pixels[w, h] :=
 RgbToRed(Image1.Canvas.Pixels[w, h]);
if (Gre > Red) and (Gre > Blu) then
Image1.Canvas.Pixels[w, h] :=
 RgbToGre(Image1.Canvas.Pixels[w, h]);
if (Blu > Red) and (Blu > Gre) then
Image1.Canvas.Pixels[w, h] :=
 RgbToBlu(Image1.Canvas.Pixels[w, h]);

end;

end.

_________________
Всё относительно... Чтобы грамотно задать вопрос, нужно знать большую часть ответа.
<<Fishing Overclan>>


 

Member
Статус: Не в сети
Регистрация: 08.11.2005
Если грубо, то
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  i,j: integer;
  r,g,b: cardinal;
  s: string;
  rval,gval,bval: string;
begin
  r:=0;
  g:=0;
  b:=0;
  for i:=0 to Image1.Width-1 do
    for j:=0 to Image1.Height-1 do
  begin
    s:=ColorToString(Image1.Canvas.Pixels[i,j]);
    if pos('cl',s)=1 then Continue;
    bval:=copy(s,4,2);
    gval:=copy(s,6,2);
    rval:=copy(s,8,2);
    if (bval>gval) and (bval>rval) then inc(b) else
    if (gval>bval) and (gval>rval) then inc(g) else
    if (rval>gval) and (rval>bval) then inc(r);
  end;
end;


Переменные r,g,b в конце содержат значение преобладания каждого из цветов. Потом пусть закрашивает.
з.ы. т.к. мне лениво было разбираться глубже, то ему еще надо будет решить как обрабатывать цвет, когда ColorToString(Image1.Canvas.Pixels[i,j]) возвращает не hex, а соотв. имя напр. clWhite

_________________
AM4/B550-F/5950X/128Gb/4070S/4x4Tb NVMe


 

Member
Статус: Не в сети
Регистрация: 19.10.2004
Откуда: Москва, СВАО
Mike3000 Тебе от друга огромнейшее спасибо :beer:

_________________
Всё относительно... Чтобы грамотно задать вопрос, нужно знать большую часть ответа.
<<Fishing Overclan>>


 

Member
Статус: Не в сети
Регистрация: 22.01.2007
Откуда: Самара
AzaZeo писал(а):
Mike3000
И ещё немного оптимизации (вот тут правда, AFAIR... но скорее всего правда)
лучше не так
Код:
var i: integer;
for i:=0 to Length(as)-1 do

а так
Код:
var i, sub_i: integer;
 sub_i:=Length(as)-1;
for i:=0 to sub_i do

Т.к. по-моему при каждом проходе вызывается процедура определения длинны Ленх... а это несколько дольше чем просто сравнить с числом.


Здесь вы не правы. Заголовок цикла for читается только один раз, перед началом запуска цикла. Присваивание будет лишним.
Другое дело циклы while и repeat/until - вот в них условие будет проверяться на каждом шаге, и уже есть смысл добавить переменную.

_________________
No pain - no gain


 

Member
Статус: Не в сети
Регистрация: 08.11.2005
Just`Ice писал(а):
Здесь вы не правы. Заголовок цикла for читается только один раз, перед началом запуска цикла. Присваивание будет лишним.

Ошибаетесь
Код:
for i:=0 to Table.RecordCount-1 do ...
попробуйте открыть dbf'ку весом мегов на 500-600 и пробегитесь пошагово... всегда лучше делать так:
Код:
var rc: integer;
begin
  rc:=Table.RecordCount;
  for i:=0 to rc-1 do ...

:) а еще лучше так
Код:
while not Table.eof do...
если конечно не собираетесь выводить ProgressBar

_________________
AM4/B550-F/5950X/128Gb/4070S/4x4Tb NVMe


 

Member
Статус: Не в сети
Регистрация: 02.12.2004
Добрый день, уважаемые!

Пожалуйста, помогите мне решить одну проблему.
Ошибка в присвоении значения :oops: (самому стыдно :) )

Вообщем строчка на которой компилятор ругается:
Код:
Test.Quastions[CurrentQ.IndexNonVisual].Text:=frmAddQ.mQText.Text;

Ошибка :
Цитата:
[Pascal Error] uMain.pas(1030): E2064 Left side cannot be assigned to

Test.Quastions[CurrentQ.IndexNonVisual].Text - тип TCaption (= type string)
mQText.Text - тоже самое т.е. тип TCaption (= type string), а mQText это TMemo

Объявление типа:
Код:
TQuastion = record
    Text : TCaption;
    QType : byte;
    TimeSec : integer;
    Answers : CAnswers;
    Code : extended;
  end;


Объявление класса:

Код:
CQuastions = class
    private
      FCount : integer;
      FQuastions : array of TQuastion;
      function GetQuastion(QuastionIndex : integer) : TQuastion;
      Procedure SetQuastion(QuastionIndex : Integer; NewQuastion : TQuastion);
    public
      constructor Create;
      destructor Destroy;
      function GetNewQuastionCode : extended;
      function AddQuastion (Quastion : TQuastion) : boolean;
      function AddQuastionWithAnswer (Quastion : TQuastion) : boolean;
      function ModifyQuastion (OldQuastionIndex : integer; NewQuastion : TQuastion) : boolean;
      function DeleteQuastion (QuastionIndex : integer) : boolean;
      function DeleteAll : boolean;
      property Quastions [QuastionIndex : integer] : TQuastion read GetQuastion write SetQuastion; default;
      property Count : integer read FCount;
  end;


 

Member
Статус: Не в сети
Регистрация: 08.11.2005
попробуй
Код:
Test.Quastions[CurrentQ.IndexNonVisual].Text:=TCaption(frmAddQ.mQText.Text);

_________________
AM4/B550-F/5950X/128Gb/4070S/4x4Tb NVMe


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 2317 • Страница 89 из 116<  1 ... 86  87  88  89  90  91  92 ... 116  >
-

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


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

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


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

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan