Тема открыта по просьбе жителей Королевства и посвящена обсуждению вопросов оптимизации кода. Выставляйте свои лучшие и худшие тексты и не стесняйтесь их обсуждать. В споре рождается истина. Или, по крайней мере, оптимизация.
Всего в теме 737 сообщений
Добавить свое сообщение
Отслеживать это обсуждение 
- Тестирование проекта. Отладка.
- Подводные камни
- Централизованная обработка ошибок
- Бета-тестирование
- Давайте учиться на ошибках.
- Почему программисты допускают ошибки?
- Автоматизированные тесты для GUI
- О системах контроля ошибок
№ 327 07-10-2005 07:45 |  |
Ответ на »сообщение 325« (al_mt)
___________________________
А мне кажется, что такое явное указание повышает удобочитаемость программ. Ибо становится ясной не только реализация, но и ход мысли программиста. По крайней мере, мне в собственном коде становится проще разобраться :)
Ваше мнение?
Хотел написать большой монолог, но потом передумал. Лучше скажите, как бы Вы писали понятный для себя код на Java?
№ 326 07-10-2005 07:33 |  |
Ответ на »сообщение 325« (al_mt)
___________________________
Указатель на указатель...
№ 325 07-10-2005 07:17 |  |
Это не вопрос и не ответ, а скорее опрос. Дело в том, что при пользовании ООП в дельфах, я все операции с указателями на объекты прописываю явно, ну там ^@. Некоторых моих коллег это дико злит (уж не знаю почему :) ). А мне кажется, что такое явное указание повышает удобочитаемость программ. Ибо становится ясной не только реализация, но и ход мысли программиста. По крайней мере, мне в собственном коде становится проще разобраться :)
Ваше мнение?
№ 324 01-10-2005 11:54 |  |
дополню »сообщение 323«
___________________________
Дурацкий совет: обновляйте прогрессбар не при каждом шаге, а, допустим, при каждом десятом. Иногда такие трюки приводят к существенному ускорению.
Вобщем без прогона под провайлером трудно сказать, что тормозит.
№ 323 01-10-2005 11:48 |  |
Ответ на »сообщение 320« (Евгений)
___________________________
Извините за несколько отвлеченный ответ, но
насколько я знаю, прежде всего надо исследовать и понять за счет чего тормозит. Что говорят профайлеры на эту тему? А кстати, какие профайлеры для дельфей порекомендуют собравшиеся?
№ 322 01-10-2005 06:24 |  |
Ответ на »сообщение 320« (Евгений)
___________________________
Дополню:
if xx>=3.14*d then
В Delphi есть функция Pi
T[i,0,k]:=T[i,1,k]+(dy/lamb[round(T[i,1,k])])*q1
else
T[i,0,k]:=T[i,1,k]+(al*dy/lamb[round(T[i,1,k])])*(T[i,1,k]-T0)
Не стоит вычислять lamb, если Вы используете величину ей обратную. Вычисляйте dy/lamb.
Вообще, я бы посоветовал привести текст реализуемой задачи. На Королевстве наверняка есть знающие вычислительную математику - могут подсказать более эффективный алгоритм.
С уважением,
№ 321 01-10-2005 05:45 |  |
Ответ на »сообщение 320« (Евгений)
___________________________
Добрый день!
Извините, но Ваш код трудночитаем: имена переменных кроме Вас никому ни о чем не говорят,
нет отступов.
Не назову себя специалистом по оптимизации,
но вот несколько соображений:
For i:=0 to n+1 do
for j:=0 to m+1 do
for k:=0 to kk+1 do
T1[i,j,k]:=T[i,j,k];
Если массивы одного и то же типа, то можно выполнить присваивание
T1:=T;
Fox:=dt/(dx*dx);
Foy:=dt/(dy*dy);
Foz:=dt/(dz*dz);
Fo:=-2*(Fox+Foy+Foz);
Fo:=-2*(Fox+Foy+Foz);
Этот код можно поместить перед циклом repeat-until,
if (((i-nnn)*(i-nnn)/(aaa*aaa))+((k-kkk)*(k-kkk)/(bbb*bbb)))<1
Деление, вроде бы, до сих пор медленнее умножения.
Можно написать так:
if ( Sqr(i-nnn)*Sqr(aaa)+Sqr(k-kkk)*Sqr(bbb))<Sqr(bbb)*Sqr(aaa)
Кроме того, Sqr(bbb), Sqr(aaa) можно вычислить перед циклом.
for j:=0 to m do
for k:=0 to kk do
begin
T[0,j,k]:=T[1,j,k];
T[n+1,j,k]:=T[n,j,k];
end;
Как уже говорилось ниже, цикл
for i:=m downto 0 do будет выполняться чуток быстрее (сравнение с 0 требует меньше ассемблерных команд)
for ii:=0 to 10000 do
begin
w[ii]:=aw1+bw1*ii+cw1*ii*ii-(aw2+bw2*ii+cw2*ii*ii)*sig+(aw3+bw3*ii+cw3*ii*ii)*sig*sig;
lamb[ii]:=al1+bl1*ii+cl1*ii*ii-(al2+bl2*ii+cl2*ii*ii)*sig+(al3+bl3*ii+cl3*ii*ii)*sig*sig;
end;
Значение sig*sig можно вычислить перед циклом,
а ii*ii можно вычислять только 1 раз на каждой итерации
dt1:=1;te:=0;
....
repeat
te:=te+dt1;
....
if te<kon then
form1.ProgressBar1.Position:=round(te*100/kon);
until te>=kon;
if te<kon then можно в любом случае убрать - оно примет False только 1 раз, перед выходом из цикла.
Если dt1 = 1 всегда, то лучше заменить repeat на for
for te:=0 to Trunc(kon) do begin
...
end
С уважением,
№ 320 01-10-2005 04:21 |  |
Есть кусок программы, работу которого нужно ускорить:
for ii:=0 to 10000 do
begin
w[ii]:=aw1+bw1*ii+cw1*ii*ii-(aw2+bw2*ii+cw2*ii*ii)*sig+(aw3+bw3*ii+cw3*ii*ii)*sig*sig;
lamb[ii]:=al1+bl1*ii+cl1*ii*ii-(al2+bl2*ii+cl2*ii*ii)*sig+(al3+bl3*ii+cl3*ii*ii)*sig*sig;
end;
dt:=0.5/(wmax*((1/(dx*dx))+(1/(dy*dy))+(1/(dz*dz))));
Form1.dto.text:=floattostr(dt);
Vrem:=strtofloat(Form1.tt.Text);
dt1:=1;te:=0;
kon:=round(Vrem/dt);
aaa:=ddx/(2*dx);
bbb:=ddz/(2*dz);
nnn:=0;
kkk:=0;
p:=0;
xx:=0;
for i:=0 to n+1 do
for j:=0 to m+1 do
for k:=0 to kk+1 do
T[i,j,k]:=100;
repeat
te:=te+dt1;
nnn:=nnn+v*dt/dx;
xx:=xx+v*dt;
if xx>=3.14*d then
begin
p:=p+1;
xx:=0;
kkk:=kkk+s/dx;
nnn:=0;
end;
for j:=0 to m do
for k:=0 to kk do
begin
T[0,j,k]:=T[1,j,k];
T[n+1,j,k]:=T[n,j,k];
end;
for i:=0 to n do
for j:=0 to m do
begin
T[i,j,0]:=T[i,j,1];
T[i,j,kk+1]:=T[i,j,kk];
end;
for i:=0 to n do
for k:=0 to kk do
begin
T[i,m+1,k]:=T[i,m,k];
if (((i-nnn)*(i-nnn)/(aaa*aaa))+((k-kkk)*(k-kkk)/(bbb*bbb)))<1 then
T[i,0,k]:=T[i,1,k]+(dy/lamb[round(T[i,1,k])])*q1
else
T[i,0,k]:=T[i,1,k]+(al*dy/lamb[round(T[i,1,k])])*(T[i,1,k]-T0)
end;
For i:=0 to n+1 do
for j:=0 to m+1 do
for k:=0 to kk+1 do
T1[i,j,k]:=T[i,j,k];
Fox:=dt/(dx*dx);
Foy:=dt/(dy*dy);
Foz:=dt/(dz*dz);
Fo:=-2*(Fox+Foy+Foz);
Fo:=-2*(Fox+Foy+Foz);
For i:=1 to n do
for j:=1 to m do
for k:=1 to kk do
begin
T[i,j,k]:=T1[i,j,k]+w[round(T1[i,j,k])]*(Fox*(T1[i+1,j,k]+T1[i-1,j,k])+
Foy*(T1[i,j+1,k]+T1[i,j-1,k])+
Foz*(T1[i,j,k+1]+T1[i,j,k-1])+Fo);
end;
if te<kon then
form1.ProgressBar1.Position:=round(te*100/kon);
until te>=kon;
а то процесс работы сего продукта затягивается на неимоверные сроки...
Я оптимизировал, как смог...
Хотелось бы узнать есть ли еще какие нибудь пути оптимизации данной программы...
Заранее спасибо.
№ 319 15-09-2005 11:51 |  |
Ответ на »сообщение 317« (panda)
___________________________
>>> Когда у меня были маленькие и глупенькие заказчики, я как раз всегда убеждал их сделать так, как считал правильным :-)
Ладно, будем считать, что они -- тинейджеры-максимаоисты, не имеющие представления о реальной жизни ;-)
№ 318 15-09-2005 08:36 |  |
Ответ на »сообщение 316« (Max Belugin)
___________________________
тут вопрос такой. версию N+1 сделать проще на VB, а [N+1...N+n] проще на дельфи.
т.е. выигрывая в краткосрочном плане, проигрываем в долгосрочном.
Чаще всего оно так (хотя и не всегда).
Хотя есть и другой момент: пока Вы готовите свое наступление в долгосрочном плане, конкурент может разорить Вас, выиграв в краткосрочном.
Добавить свое сообщение
Отслеживать это обсуждение 
Дополнительная навигация: |
|