![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Какой код лучше?
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)
> лучше
Легко. Определяешь объективные критерии лучшести и сравниваешь по этим критериям.