Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Какой код лучше?


Страницы:   1 2

pro_xaoc ©   (2010-05-21 10:29:00) 

Всем привет! Вот например, есть два способа написания процедуры или части кода, а теперь, как можно узнать какой из этих кодов быстрее, лучше?


Sha   (2010-05-22 11:01:00) [1]

> _Юрий ©   (22.05.10 10:52) [20]

Есть программисты и программисты.


_Юрий   (2010-05-22 10:52:00) [2]


> Sha ©   (22.05.10 10:35) [19]


чтобы не превратилось, просто не нужно никогда так писать в библиотечных модулях (общего назначения). А в методе форм1баттон1клик - ничего страшного.
Кстати, есть еще такой критерий, как скорость программирования, тоже важный :-)


Sha   (2010-05-22 10:35:00) [3]

Проблема в том, что "один при отладке"
может  превратиться в "N^3 при эксплуатации".


_Юрий   (2010-05-22 10:26:00) [4]


> Sha ©   (22.05.10 10:16) [16]


Такой код является критерием качества программиста:-)

Собственно, какие еще критерии качества кода  могут быть, кроме скорости?
Видимо, безошибочность и расширяемость. В данном случае тут проблем ни по тому ни по другому нет.

Но если там строка из 50 символов, и всего один проход, то в общем то не особо важно, сколько пользователь ждал ответа на нажатие кнопки - сотую долю секунды или десятую


Sha   (2010-05-22 10:25:00) [5]

Я уж не говорю про таких

   s:=Copy(s, 1, Pos(' ', s) - 1) + Copy(s, Pos(' ', s) + 1, Length(s) - Pos(' ', s));


Sha   (2010-05-22 10:16:00) [6]

С другой стороны, такой код тоже "не всегда является главным критерием качества" :)

var
 s: string;
begin
  ...
  while pos(' ',s)>0 do
  begin
    delete(s, pos(' ',s), 1);
  end;
  ...
end;


_Юрий   (2010-05-22 10:04:00) [7]


>  Скорей всего, что оба хреновые.
>
>

Даже их двух хреновых кодов один все равно хреновее другого. Крайне трудно написать два кода абсолютно одинаковой хреновости:-)

По сабжу: скорость выполнения далеко не всегда является главным критерием качества кода. А точнее, очень редко, только очень в тяжелых и длительных процедурах.


0x00FF00   (2010-05-22 02:16:00) [8]

> Скорей всего, что оба хреновые.

Злобно =)


Amoeba_   (2010-05-21 18:07:00) [9]


> есть два способа написания процедуры или части кода
>

И где они, эти два мифических способа?  Хоть бы показал чест ому народу свои достижение на ниве программирования. Скорей всего, что оба хреновые.


Плохиш   (2010-05-21 16:28:00) [10]


> Какой код лучше?

Тот, который всегда продуцирует требуемый результат.


Омлет   (2010-05-21 13:22:00) [11]

Пример замера времени работы разных процедур:
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1273081388&n=18&from=51


han_malign   (2010-05-21 13:04:00) [12]


> ExecuteMyCode();
> duration:=GetTickCount()-start;
> ShowMessage('Код выполнялся '+inttostr(duration)+' миллисекунд');

- в нормальном варианте(когда функция достаточно короткая) от 0 да 100(1-5 квантов), зависит не от функции, а от того - сколько раз поток был вытеснен системой...
Может помочь функция GetThreadTimes, которая в lpUserTime возвращает время в течении которого процессор был занят конкретно этим потоком(причем не считая времени на переключение потоков, и время "занятое" у потока ядром(lpKernelTime) на всякие DPC), но различное состояние кэшэй процессора и подсистемы памяти(пресловутый Page Fault при подгрузке) может давать относительную погрешность измерения больше 100%. Поэтому, для улучшения оценки необходимо увеличивать выборку. Причем - все выделения/освобождения памяти желательно по возможности выносить за пределы тестируемого кода, т.к. они по времени могут занимать на порядок больше времени чем сам алгоритм...(пламенный привет - мусорной куче .NET)


Ega23   (2010-05-21 11:50:00) [13]


> Может ExecuteMyCode выполнятся каждый раз разное кол-во
> времени.... а нужно узнать не среднее(общее), а конкретный
> вызов....


Тогда этот замер не имеет смысла.


{RASkov}   (2010-05-21 11:26:00) [14]

> [7] han_malign   (21.05.10 11:18)
> - правильнее

что значит правильнее?
зависит от условий задачи.
Может ExecuteMyCode выполнятся каждый раз разное кол-во времени.... а нужно узнать не среднее(общее), а конкретный вызов....


han_malign   (2010-05-21 11:18:00) [15]


> ExecuteMyCode();

- правильнее for i:= 1 to 1000000 do ExecuteMyCode();


RWolf   (2010-05-21 11:12:00) [16]

start:=GetTickCount();
ExecuteMyCode();
duration:=GetTickCount()-start;
ShowMessage('Код выполнялся '+inttostr(duration)+' миллисекунд');


pro_xaoc   (2010-05-21 11:02:00) [17]


> засечь время перед, потом после выполнения и сравнить.Это
> если критерий - время.

как засечь? чем засечь? можно поподробнее?


Jeer   (2010-05-21 10:57:00) [18]


> А как тестировать?
>


засечь время перед, потом после выполнения и сравнить.
Это если критерий - время.


pro_xaoc   (2010-05-21 10:47:00) [19]


> Протестировать.

А как тестировать?


Sergey13   (2010-05-21 10:44:00) [20]

> [0] pro_xaoc ©   (21.05.10 10:29)
> лучше

Легко. Определяешь объективные критерии лучшести и сравниваешь по этим критериям.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо