Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.09.12;
Скачать: CL | DM;

Вниз

---|Ветка была без названия|---   Найти похожие ветки 

 
Jeer ©   (2002-08-16 11:29) [80]

Я и не сказал, что это плохая или неверная конструкция или есть короче запись или понятнее.
Ремарка была о том, что не надо вслепую переносить сишные приемы на паскаль.


 
kull ©   (2002-08-16 11:30) [81]


> Юрий Зотов © (15.08.02 19:14)

Прежде чем ссылаться на документацию, надо ее прочитать.
Передо мной лежит коробка с лицензионным Delphi, и в прилагаемой брошюре написано, что True соответствует 1, а False - 0.

Вот млин, заклинило тут многих с этой внутренней реализаций.
Нет у меня дурной привычки заглядывать, в исходники и копаться в asm коде. Я стараюсь отталкиваться только от документации и вам советую.


 
kull ©   (2002-08-16 11:33) [82]


> Jeer

А сишные приемы на Pascal я не переносил...
В C++ я все равно полный ламер. А кода по возможности должно быть меньше.
Проще конструкция - надежней код.


 
Anatoly Podgoretsky ©   (2002-08-16 11:40) [83]

Исходя из темы, то ты как раз и опираешься на внутренню реализация конкретного компилятора, пусть и документированную.
Хотя было уже не раз, когда по ходу меняли те или другие типы.


 
Jeer ©   (2002-08-16 12:22) [84]

kull © (16.08.02 11:33)
>А кода по возможности должно быть меньше.

В общем-то да, конечно.
Но ЯВУ - это для чтения и написания человеком и безопасность кодирования впрямую связана с хорошей узнаваемостью и понимаемостью кода. А здесь без некоторых приемов их повышения не обойтись.

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


 
kull ©   (2002-08-16 12:23) [85]


> Anatoly Podgoretsky

Нет я не опираюсь на внутреннюю реализацию.

Вы возможно путаете понятия...

Для меня есть вход True, и выход 1;
Для меня есть вход False, и выход 0;
Все что происходит внутри этого черного ящика меня не волнует. Так вот то что происходит внутри это и есть внутренняя реализация. А когда я открываю Help и читаю, что должно быть на входе функции и что на выходе, то это не относится к внутренней реализации - это интерфейс, если угодно.

Кстати насчет внутренней реализации и копания в исходниках.-

Откройте любую версию Delphi и поищите в каталоге Delphi\Source текст - "Integer(".
Вы найдете в результатах поиска множество интерестных преобразований типа Boolean->Integer. Или Borland не следует своей документации?


 
kull ©   (2002-08-16 12:26) [86]


> Jeer © (16.08.02 12:22)

С этим а согласен. Конечно надописать проще и короче по возможности, но не в ущерб читаемости и надежности.


 
Виктор Щербаков ©   (2002-08-16 12:28) [87]


> Откройте любую версию Delphi и поищите в каталоге Delphi\Source
> текст - "Integer(".
> Вы найдете в результатах поиска множество интерестных преобразований
> типа Boolean->Integer. Или Borland не следует своей документации?

В этом случае привязки к текущей реализации нет. Преобразование быдет выполнять компилятор. Вернее он будет генерировать код для этого преобразования.


 
Anatoly Podgoretsky ©   (2002-08-16 12:32) [88]

kull © (16.08.02 12:23)
Я с тобой буду согласен, если мы будем говорить о конкретных реализациях Паскаля от Борланда, но если будем говорить о более широком спектре или более того вообще о методах написания безопасного кода, то я согласиться не смогу.

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

В тоже время в любом букваре по безопасному коду написано, избегайте преобразования или приведения кода без нужды.


 
VEG ©   (2002-08-16 12:41) [89]

Тестовая программа:
var
L:Integer;
S:String;
Time:Integer;
FTD:Integer;
begin
Time:=GetTickCount;
For FTD:=1 to 1000000 do
begin
S:="ABC";
(*Код для решения задачи*)
end;
Time:=GetTickCount-Time;
end;
Результаты тестов всех предложенных вариантов:
1.
L:=Length(S);
Inc(L,-3);
If L<0 then L:=0;
SetLength(S,L);
Результат: 110 мс.

2.
If Length(S)>2 then SetLength(S,Length(S)-3) else S:="";
Результат: 124 мс.

3.
SetLength(S,Integer(Length(S)>2)*(Length(S)-3));
Результат: 149 мс.

4.
If Length(S)>2 then Delete(S,Length(S)-2,3) else S:="";
Результат: 890 мс.

Для справок: Все тесты проводились на процессоре Pentium III - 550Mhz.


 
kull ©   (2002-08-16 12:50) [90]


> Виктор Щербаков
> В этом случае привязки к текущей реализации нет.

Что и требовалось доказать.
(Или может Boolean->Integer, будет компилится по разному в зависимости от того в каком каталоге находится?)


> но если будем говорить о более широком спектре или более
> того вообще о методах написания безопасного кода

В более широком спектре может не оказаться и функции SetLength...
Более того модет не оказаться длинных строк...


> Ссылка на код других программистов из Source хоть и хорошая,
> но не является доказательством...

А документация тоже не доказательство? Тогда какими "букварями" вы пользуетесь?



 
kull ©   (2002-08-16 13:12) [91]


> VEG © (16.08.02 12:41)

Естественно. В 1 случае Length вызывается только 1 раз а в других 2.

Но попробуйте строчку (S="ABC") сделать подлиннее, разница уже не столь велика.

К тому же оптимизация скорости в большинстве случаев ведет к понижению гибкости кода, ухудшению читаемости, и трудности сопровождения. Согласитесь что тот же алгоритм можно реализовать на ассемблере и он будет работать еще быстрее.

Оптимизация нужна только тогда когда критична скорость работы.


 
DiamondShark ©   (2002-08-16 14:07) [92]

2 kull

Зачем такая глухая оборона? Из принципа?

Все понимают, что такой код не оправдан ни читабельностью, ни размером машкода, ни скоростью, ни надежностью.


 
kull ©   (2002-08-16 17:25) [93]


> Все понимают, что такой код не оправдан ни читабельностью,
> ни размером машкода, ни скоростью, ни надежностью.

Вы правы только в оценке скорости (и то может быть).


Если не нравится Boolean->Integer, вот вам другой код:

SetLength(S,Max(0,Length(S)-3));

Не менее надежно, читабельно, и по скорости сооветствует 1-ому варианту.
И я думаю это более читабельно чем:
L:=Length(S);
Inc(L,-3);
If L<0 then L:=0;
SetLength(S,L);


Так что я дмаю, что стремление к такому коду более оправдано.

Ну что теперь скажете насчет внутренней реализации?


 
VEG ©   (2002-08-16 20:25) [94]

Рейтинг изменился!
Для 1-го символа:
1.
If Length(S)>2 then SetLength(S,Length(S)-3) else S:="";
Результат: 89 мс., 910 мс.

2.
If Length(S)>2 then Delete(S,Length(S)-2,3) else S:="";
Результат: 90 мс., 910 мс.

3.
L:=Length(S);
Inc(L,-3);
If L<0 then L:=0;
SetLength(S,L);
Результат: 111 мс., 1140 мс.

4.
SetLength(S,Max(0,Length(S)-3));
Результат: 116 мс., 1275 мс.

5.
SetLength(S,Integer(Length(S)>2)*(Length(S)-3));
Результат: 145 мс., 1533 мс.


Для 3-х символов:
1.
L:=Length(S);
Inc(L,-3);
If L<0 then L:=0;
SetLength(S,L);
Результат: 110 мс., 1119 мс.

2.
If Length(S)>2 then SetLength(S,Length(S)-3) else S:="";
Результат: 124 мс., 1260 мс.

3.
SetLength(S,Max(0,Length(S)-3));
Результат: 125 мс., 1274 мс.

4.
SetLength(S,Integer(Length(S)>2)*(Length(S)-3));
Результат: 149 мс., 1516 мс.

5.
If Length(S)>2 then Delete(S,Length(S)-2,3) else S:="";
Результат: 890 мс., 8842 мс.


Для 6-ти символов:
1.
L:=Length(S);
Inc(L,-3);
If L<0 then L:=0;
SetLength(S,L);
Результат: 736 мс., 7413 мс.

2.
If Length(S)>2 then SetLength(S,Length(S)-3) else S:="";
Результат: 737 мс., 7442 мс.

3.
SetLength(S,Max(0,Length(S)-3));
Результат: 739 мс., 7473 мс.

4.
SetLength(S,Integer(Length(S)>2)*(Length(S)-3));
Результат: 758 мс., 7694 мс.

5.
If Length(S)>2 then Delete(S,Length(S)-2,3) else S:="";
Результат: 1172 мс., 11790 мс.


Время, потраченное на присваивание строки: 71 мс., 749 мс.

Примечание: Первая цифра - цикл 1000000; Вторая цифра - цикл 10000000.

Для справок: Все тесты проводились на процессоре Pentium III - 550Mhz.

Примечание от тестера: В первом тесте первые два победителя виграли как-бы не совсем честно, т.к. используют простое присваивание. Во-втором тесте три первых кода работали почти с одинаковой скоростью. Из всех тестов я получил вот такой код, на мой взгляд, самый оптимальный:
L:=Length(S);
If L>2 then SetLength(S,L-3) else S:="";

Вот то, что показали тесты:
Для 6-ти символов: 730 мс., 7407 мс.;
Для 3-х символов: 108 мс., 1126 мс.;
Для 1-го символа: 92 мс., 975 мс.;


 
kull ©   (2002-08-16 23:54) [95]

Да, первый вариант наиболее оптимальный, по скорости.

Разница между 7473 и 7413 - 0.8%, т.е. для часа в 3. варианте получаем 59 мин. 30 сек. в 1. варианте. Мощная оптимизация!

Но при длине строки S равной, например 100, разница в скорости совсем незначительна.


 
Anatoly Podgoretsky ©   (2002-08-17 00:06) [96]

kull © (16.08.02 17:25)
К такому коду вообще нет претензий


 
kull ©   (2002-08-17 00:16) [97]

Часто когда я слышу рассуждения и выкладки фанатов скорости, становится смешно.
Вообще-то о скорости надо заботится когда есть в это насущная необходимость.

У меня много горького опыта, основанного на стремлении нашего бывшего менеджера проекта к различной оптимизации:

Экономил он на каждой милисекунде, на каждом байте в трафике. Даже когда поля из Query вытакиваешь, он говорил что лучше вызывать не FieldByName(FieldName), а Fields[Index]. Мол так быстрее будет. Вместо Integer предпочитал byte - как же в 4 раза меньше места занимает! И прочие странные прихоти...

Так вот, наша команда до сих пор трахается над кодом, когда нужно изменить порядок полей в запросе, когда байта уже не хватает, или когда надо добавить новую функциональность. А менеджера этого нет в проекте уже 2 года, но "наоптимизировать" он успел много, по сию пору расхлебываем. Проект по его милости получился настолько негибким, нерасширяемым, и трудно сопровождаемым, что для себя мы поняли твердо - "Не надо заниматься преждевременной оптимизацией!"

Кстати о "букварях" по безопасному коду так там про оптимизацию тоже самое сказано.

Так что десять раз подумайте перед тем как размышлять о размере машкода и скорости.



Страницы: 1 2 3 вся ветка

Текущий архив: 2002.09.12;
Скачать: CL | DM;

Наверх




Память: 0.66 MB
Время: 0.03 c
3-35599
Shrek
2002-08-20 21:52
2002.09.12
Installer BDE


3-35618
Наташа
2002-08-23 10:25
2002.09.12
Пароли в Paradox


1-35644
zxas
2002-09-01 20:18
2002.09.12
Интересный вопрос !!!


1-35764
atmospheric
2002-08-30 16:24
2002.09.12
Распознование текста ?


3-35607
OGR
2002-08-22 15:29
2002.09.12
Помогите разобраться с FieldTtpe при создании таблицы в RunTime