Форум: "Потрепаться";
Текущий архив: 2002.09.12;
Скачать: [xml.tar.bz2];
Вниз---|Ветка была без названия|--- Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.64 MB
Время: 0.013 c