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

Вниз

Нужно ли бороться с хинтами и ворнингами?   Найти похожие ветки 

 
Prohodil Mimo ©   (2004-08-09 12:04) [80]

[74] Думкин, ну хотя бы [52] 2.
[76], глобальных переменных не должно быть?
А если 10 процедур по обработке таблицы, к примеру обработка СтрингГрида, перемещение по строкам, колонкам. В каждой процедуре держать эти переменные?
Каждая процедура может вызывать функции, которые используют текущие состояния этих переменных. зачем в них передавать значения, если можно объявить их глобально? Чем это плохо? не тратится время проца. К тому же в книгах по написанию игр для быстроты работы как раз и рекомендуют применять данный способ.

Восможно я излагаю мысли не совсем понятно... но извиняйте... какой есть.


 
Sandman25 ©   (2004-08-09 12:05) [81]

[80] Prohodil Mimo ©   (09.08.04 12:04)

Такие переменные не стоит называть переменными цикла.


 
Prohodil Mimo ©   (2004-08-09 12:09) [82]

А как их назвать, если :

Var
  TekRow, TekCol: Word;

Procedure ....
Begin
For TekCol=0 to ColsCount do
  For TekRow=0 to RowsCount do
  Begin
     .........
     .........
  End;
End;

?????


 
Думкин ©   (2004-08-09 12:10) [83]

> [80] Prohodil Mimo ©   (09.08.04 12:04)

Ну так персонально и надо. Да и есть тихое подозрение что там сказано меньше.

> [80] Prohodil Mimo ©   (09.08.04 12:04)
> А если 10 процедур по обработке таблицы, к примеру обработка
> СтрингГрида, перемещение по строкам, колонкам. В каждой
> процедуре держать эти переменные?
> Каждая процедура может вызывать функции, которые используют
> текущие состояния этих переменных. зачем в них передавать
> значения, если можно объявить их глобально? Чем это плохо?
> не тратится время проца. К тому же в книгах по написанию
> игр для быстроты работы как раз и рекомендуют применять
> данный способ.

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


 
Prohodil Mimo ©   (2004-08-09 12:12) [84]

[83] Думкин
>Но переменную для цикла локально - неа, не буду. Во-всяком случае, пока.

Не понял.


 
Думкин ©   (2004-08-09 12:13) [85]


> [84] Prohodil Mimo ©   (09.08.04 12:12)

Ну в смысле попутался. :)
Глобальную под цикл - не буду.


 
Sandman25 ©   (2004-08-09 12:14) [86]

[82] Prohodil Mimo ©   (09.08.04 12:09)
А как их назвать, если :

Текущие индексы, индексы текущей ячейки. Ничего общего с переменными цикла :)


 
Яод   (2004-08-09 12:14) [87]

Prohodil Mimo ©

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

Вместо локальных переменных, особенно в циклах, часто бывает использование регистров и это что, медленнее, чем использование глобальных переменных?


 
Prohodil Mimo ©   (2004-08-09 12:16) [88]

[83] Думкин
>Я бы все это в класс внес и его свойства, во-всяком случае постарался.

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


 
Prohodil Mimo ©   (2004-08-09 12:17) [89]

[86] Sandman25

Что тогда переменная цыкла?


 
Prohodil Mimo ©   (2004-08-09 12:18) [90]

[87] Яод, а мой вариант настолько криминальный?


 
Sandman25 ©   (2004-08-09 12:20) [91]

[89] Prohodil Mimo ©   (09.08.04 12:17)

Вызываемые процедуры используют текущие значения индексов без циклов?


 
Яод   (2004-08-09 12:22) [92]

Prohodil Mimo ©  
компиляторы становятся умнее, чтобы избавить программистов от размышлений, а как тут лучше и во-сколько байт уместить и пытаясь им помешать можешь получить ситуацию наоборот
это так, в общем ...


 
Prohodil Mimo ©   (2004-08-09 12:24) [93]

[91] Sandman25, да.


 
Sandman25 ©   (2004-08-09 12:25) [94]

[93] Prohodil Mimo ©   (09.08.04 12:24)

Значит это не переменная цикла, а переменная для передачи значения.


 
Mim1 ©   (2004-08-09 12:27) [95]


> [79] Sandman25 ©   (09.08.04 11:47)

Для обьектов не выдастся сообщение "For loop control variable must be simple local variable".


 
Prohodil Mimo ©   (2004-08-09 12:29) [96]

[92] Яод, хочешь сказать, что :

Var
 TekRow, TekCol: Word;

Function MyFunc:String;
Begin
  ......
  Result:=....;
End;

Procedure ....
Begin
For TekCol=0 to ColsCount do
 For TekRow=0 to RowsCount do
 Begin
    .........
    zz:=MyFunc;
    .........
 End;
End;


Хуже чем :


Function MyFunc(TekRow, TekCol: Word):String;
Begin
  ......
  Result:=....;
End;

Procedure ....
Var
  TekRow, TekCol: Word
Begin
For TekCol=0 to ColsCount do
 For TekRow=0 to RowsCount do
 Begin
    .........
    zz:=MyFunc(TekRow, TekCol);
    .........
 End;
End;


???


 
Думкин ©   (2004-08-09 12:30) [97]

Да, хуже.


 
Sandman25 ©   (2004-08-09 12:32) [98]

[95] Mim1 ©   (09.08.04 12:27)

Я знаю. Речь шла не про варнинги, а про эффективность.


 
Mim1 ©   (2004-08-09 12:32) [99]


> Prohodil Mimo ©

Слово цикл пишется с буквой и. (надеюсь что у вас опечатка).


 
Prohodil Mimo ©   (2004-08-09 12:32) [100]

[97] Думкин
А обосновать?


 
Sandman25 ©   (2004-08-09 12:33) [101]

[99] Mim1 ©   (09.08.04 12:32)

Новое предложение должно начинаться с прописной буквы. Надеюсь, Вы совершили опечатку.


 
Prohodil Mimo ©   (2004-08-09 12:36) [102]

[99] Mim1, речь не об грамматике русского языка, но если так, то - опечатка, плюс к тому же уже лет 9 ничего не писал по русски, начинает пробиваться синтакс другого языка :о(


 
Думкин ©   (2004-08-09 12:37) [103]


> [100] Prohodil Mimo ©   (09.08.04 12:32)

А то что функция  смысл имеет в контексте внешних переменных. Непрозрачно как-то.
Уж хотя бы так:

Procedure ....
Var
TekRow, TekCol: Word;

Function MyFunc:String;
Begin
 ......
 Result:=....;
End;

Begin
For TekCol=0 to ColsCount do
For TekRow=0 to RowsCount do
Begin
   .........
   zz:=MyFunc;
   .........
End;
End;


Безусловно - дело ваше, но для меня подобное - кривость первого порядка.


 
Prohodil Mimo ©   (2004-08-09 12:40) [104]

[103] Думкин, я бы так не сказал... А если в двух процедурах используется эта функция? В каждой из них дублировать функцию?


 
Думкин ©   (2004-08-09 12:42) [105]

> [104] Prohodil Mimo ©   (09.08.04 12:40)

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


 
Prohodil Mimo ©   (2004-08-09 12:48) [106]

[105] Думкин,
>паранойя на скорость

Тут Ты прав :о)
По началу пытался научиться писать игры, от туда и осталось жадность до места в памяти и скорость (тогда был ещё ТР7 и ДОС) :о)

[76] в силе? :о)


 
Prohodil Mimo ©   (2004-08-09 12:50) [107]

[105] Думкин,
>Это повод задуматься о том, чтобы нормально ее оформить - сделать таки двуместной.

А если в десяти?


 
Думкин ©   (2004-08-09 12:54) [108]

> [106] Prohodil Mimo ©   (09.08.04 12:48)

Я начиналс МК-61, там еще большая паранойя. Потом также ДОС и т.п.
Но для тех задач, что решаю сейчас - мне важнее легкость чтения, управления кодом. Его заведомая безглючность, и желательно на этапе написания впервый раз. Скоростей хватает, а глюки способны и на мощной машине угробить всю скорость выполнения и свести ее к нулю.

> [106] Prohodil Mimo ©   (09.08.04 12:48)
> [76] в силе? :о)

Смотря что и для чего. Но на данном этапе - возможно. Если это конечно абсолютное кредо. Иногда и в единственном месте вызываемый блок оформляю в функцию. Ну чувство такое - на уровне подкорки.


 
Думкин ©   (2004-08-09 12:54) [109]

> [107] Prohodil Mimo ©   (09.08.04 12:50)

Тем более.


 
Mystic ©   (2004-08-09 12:56) [110]

Prohodil Mimo ©   (09.08.04 12:29) [96]

Хуже. Навскидку:

1. Могут быть проблемы при многопоточности. Если использовать использоватьтаким обрзом глобальные переменные, то лучше всего описывать их как threadvar.

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

3. Использования глобальных переменных отключает некоторые хинты/предупреждения.

4. При оптимизации кода компилятор всестолокальных переменных может использовать регистры. А в случае глобальных переменных --- лишен этой возможности. Лишние инструкции.

3. Оптимизация.


 
Anatoly Podgoretsky ©   (2004-08-09 13:04) [111]

Prohodil Mimo ©   (09.08.04 12:48) [106]
Если речь идет о месте в памяти, то тем более локальные переменные, хоть тысяча функций, а занято будет всего 4 байта на стеке. С глобальными память будет занята до конца работы программы.


 
Prohodil Mimo ©   (2004-08-09 13:11) [112]

[108] Думкин,
ну глюков по этим причинам я ещё ни разу не собирал.

> желательно на этапе написания впервый раз

Это когда всё по полочкам разложено. А если не знаешь что тебя ждёт впереди? Например, как сейчас, пишу программу, условия меняются чуть ли не каждый день, какк тут с первого раза написать, да ещё и гибкий код. Уже научился предвидеть возможные варианты и писать код более менее гибкий, что бы в случае очередных изменений не писать всё с нуля.

А по поводу использования функции в нескольких процедурах скажу так :
понадобилось написать определённую процедуру... написал... через время мне говорят написать другую процедуру... пишу... местами в ней есть точно такой же код как и в первой. почему бы не вынести этот код в отдельную процедуру\функцию? И зачем его туда было выносить в момент написания первой процедуры, когда о второй ещё даже и речи не было?
Одно дело когда он используется несколько раз в процедуре (и то, создаётся локальная функцыя), но когда один...
В итоге - с первого раза не получается.


 
Anatoly Podgoretsky ©   (2004-08-09 13:16) [113]

Prohodil Mimo ©   (09.08.04 13:11) [112]
ну глюков по этим причинам я ещё ни разу не собирал.

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


 
Prohodil Mimo ©   (2004-08-09 13:18) [114]

[110] Mystic

1. Могут быть проблемы при многопоточности. Если использовать использоватьтаким обрзом глобальные переменные, то лучше всего описывать их как threadvar.

Это совсем другое дело.

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

Во вложенном не используются циклы или используются свои переменные.

[111] Anatoly Podgoretsky,
а если они мне нужны в 90% всей программы?


 
Яод   (2004-08-09 13:21) [115]

Prohodil Mimo ©
для оптимизации не нужно пытаться перелопачивать весь код, а только самые длинные или часто вызываемые места
если уж не уверен, надо смотреть уже в ассемблер-коде, как используются те или иные переменные


 
Prohodil Mimo ©   (2004-08-09 13:21) [116]

[113] Anatoly Podgoretsky, чем собственно и занимаемся.

Раньше учили так, теперь по другому. :о(

Подскажите хотя бы где почитать о том как нужно оптимизировать проги для "современных компиляторов"? (ответы : в книгах, в инете - я знаю, мне бы более конкретно)


 
Игорь Шевченко ©   (2004-08-09 13:22) [117]

Prohodil Mimo ©   (09.08.04 13:18)

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


 
Prohodil Mimo ©   (2004-08-09 13:23) [118]

[115] Яод.
Не понял к чему это. Я вроде бы не писал подобного.


 
Anatoly Podgoretsky ©   (2004-08-09 13:26) [119]

П6ременные цикла, на протяжении жизни программы :-)


 
Mystic ©   (2004-08-09 13:30) [120]

Раньше учили так, теперь по другому

Во все времена локальные переменные лучше было определять локально. Нежелание их переопределять в теле каждой процедуры можно объяснить только ленью.



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

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

Наверх




Память: 0.7 MB
Время: 0.046 c
14-1092352257
nasty
2004-08-13 03:10
2004.08.29
стереотипы...


1-1092137241
Pavelkq
2004-08-10 15:27
2004.08.29
Сравнение двух TStringList-ов


1-1092315832
Реактор
2004-08-12 17:03
2004.08.29
Копия экрана


1-1092400233
Чувак
2004-08-13 16:30
2004.08.29
Событие на щелчок.


4-1089691368
V-A-V
2004-07-13 08:02
2004.08.29
Ярлык и его потраха