Shader 3.0 У меня расчет занял 43 секунды на неразогнанном Athlon 3200+ (2Ghz)
Оперативки 1.5Gb
Компилировал с помощью BDS 2006 (Update 2 HotFix RollUp10)
оптимизировал твою прогу, стала считать за 203 милисекунды....
Все что я сделал заменил вызов Memo1.Lines.Count на переменную
Member
Статус: Не в сети Регистрация: 16.04.2006 Откуда: d3d9.dll Фото: 7
Xupyp1 писал(а):
оптимизировал твою прогу, стала считать за 203 милисекунды....Все что я сделал заменил вызов Memo1.Lines.Count на переменную
Вот спасибо, друг. Даже и не мог себе представить, что из-за этого постоянного подсчета Memo1.Lines.Count программа могла так тормозить. Сейчас тоже так сделал - заменил 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
Статус: Не в сети Регистрация: 03.01.2004 Откуда: Питер
Shader 3.0 убери из кода расчета ВСЕ обращения к визуальным компонентам. Если оные присутствуют в каких-то циклах, то эта оптимизация позволит выиграть очень много.
_________________ Здесь так мало тех, с кем легко говорить,
Еще меньше тех, с кем не страшно молчать (c)
Сейчас ещё чуть оптимизнул - массивы сделал динамическими
Можно про динамические массивы поподробнее. Просто при написании программ очень не удобно использовать массивы, ввиду того что не известно сколько понадобится элементов. Если не трудно, приведите маленький пример с динамическими массивами.
Можно про динамические массивы поподробнее. Просто при написании программ очень не удобно использовать массивы, ввиду того что не известно сколько понадобится элементов. Если не трудно, приведите маленький пример с динамическими массивами.
Код:
//определение 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);
Member
Статус: Не в сети Регистрация: 16.04.2006 Откуда: d3d9.dll Фото: 7
GN писал(а):
Можно про динамические массивы поподробнее. Просто при написании программ очень не удобно использовать массивы, ввиду того что не известно сколько понадобится элементов.
Я смотрю вам уже ответили. Действительно динамические массивы очень удобная вещь, как раз из-за того что при их объявлении не надо указывать их длину (т. к. длина таких массивов может изменяться). Кстати узнать количество элементов в массиве можно ещё и с помощью функции High(a), где a - переменная типа массив (в т. ч. и динамический).
Т.к. по-моему при каждом проходе вызывается процедура определения длинны Ленх... а это несколько дольше чем просто сравнить с числом.
Полностью согласен, хотя много на этом не выиграешь.
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
Member
Статус: Не в сети Регистрация: 19.10.2004 Откуда: Москва, СВАО
Помогите пожалуйста моему другу с курсовой - найти ошибку.
Задание: Нужно в каждом пикселе посчитать кол-во красного, зелёного и соответственно синего цветов (выводить эту информацию не надо)),
потом узнать в каком пикселе какой из этих 3 цветов преобладает и закрасить этот пиксель в этот цвет...
Он написал программу, но она красит всё в красный)
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>>
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
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 - вот в них условие будет проверяться на каждом шаге, и уже есть смысл добавить переменную.
[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;
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения