Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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
3-35631
michael_b
2002-08-23 10:14
2002.09.12
Связывание таблиц


1-35791
koly01
2002-08-31 17:06
2002.09.12
TService


1-35716
$hiC0
2002-09-02 19:26
2002.09.12
Опять-таки StringGrid


1-35776
urii
2002-08-24 06:38
2002.09.12
Запуск приложения с файлом.


1-35765
pvasya
2002-08-30 15:04
2002.09.12
HOOK на Delphi





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский