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

Вниз

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

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

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

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


 
Prohodil Mimo ©   (2004-08-09 13:31) [121]

[117] Игорь Шевченко

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


Это почему? Мне так наоборот - лишние строки мешают читать.

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


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


 
Prohodil Mimo ©   (2004-08-09 13:33) [122]

[119] Anatoly Podgoretsky, речь уже пошла о глобальных переменных, а не о переменных цикла.


 
Prohodil Mimo ©   (2004-08-09 13:34) [123]

[120] Mystic, определять что лучше надо для каждого случая отдельно.


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

> [121] Prohodil Mimo ©   (09.08.04 13:31)

Это потому что ты свой 10 минут назад писанный код читаешь.

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


 
Anatoly Podgoretsky ©   (2004-08-09 13:39) [125]

Prohodil Mimo ©   (09.08.04 13:31) [121]
Ты думаешь из за глобальных/локальных переменных :-)


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


> Это почему? Мне так наоборот - лишние строки мешают читать.


Мне тоже, как ни странно, лишние строки мешают читать. Но еще больше мне мешает читать тот факт, что объявление локальной (по своей сути) переменной нужно искать за пределами функции.


 
nikkie ©   (2004-08-09 13:46) [127]

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

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

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


 
Prohodil Mimo ©   (2004-08-09 13:46) [128]

[124] Думкин

> Это потому что ты свой 10 минут назад писанный код читаешь.

Это был пример из головы, а не из программы.

а с остальным я не спорю.


> А в требованиях к программе - требования к железу.

Выходит если мне нужна какая-то прога и мой комп уже не соответствует её требованиям, то я должен бежать в магазин за новой? и так каждый год? (забота о клиенте)
Судя по играм - так оно и есть... но я в них не играю.


 
Anatoly Podgoretsky ©   (2004-08-09 13:49) [129]

Если нужна, то да. Кроме игр таких очень мало.


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

> [128] Prohodil Mimo ©   (09.08.04 13:46)

Это передергивание все-же.


 
Prohodil Mimo ©   (2004-08-09 13:52) [131]

[127] nikkie, как это можно из одного отчёта вызывать другой? и когда это может понадобиться? Такие переменные я использую в процедурах, которые друг друга вызавать не могут, уж как ты ни хоти. Написать то конечно можно, но .....


 
Юрий Зотов ©   (2004-08-09 13:52) [132]

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

> По началу пытался научиться писать игры, от туда и осталось
> жадность до места в памяти и скорость

Тогда тем более. Локальные переменные циклов for компилятор "размещает" в регистрах - то есть, экономится память и повышается скорость. Ведь Вы именно этого хотите?


 
VMcL ©   (2004-08-09 14:04) [133]

>>Юрий Зотов ©  (09.08.04 13:52) [132]

Поправка:
Локальные переменные циклов for компилятор по возможности "размещает" в регистрах...


 
nikkie ©   (2004-08-09 14:51) [134]

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

и когда это может понадобиться?
сегодня ты печатаешь табличку значений (a_ij)
for Row := 1 to RowCount do
 for Col := 1 to ColCount do
   Print(A[Row][Col]);


завтра тебя просят напечатать не абсолютные значения, а в процентах. 100% - это сумма всех элементов в строке. ты пишешь:
for Row := 1 to RowCount do
begin
 RowSum := GetRowSum;
 for Col := 1 to ColCount do
   Print(A[Row][Col] / RowSum * 100);
end;

function GetRowSum: Double;
begin
 Result := 0;
 for Col := 1 to ColCount do
   Result := Result + A[Row][Col];
end;

м-да, Col получается изменяется внутри GetSum - но ты спокоен, поскольку GetSum вызывается вне цикла по Col.

а через месяц выясняется, что делить надо не только на сумму элементов в строке, но и на сумму элементов в столбце. и ты побыстрому все исправляешь:
for Row := 1 to RowCount do
begin
 RowSum := GetRowSum;
 for Col := 1 to ColCount do
 begin
   ColSum := GetColSum;
   Print(A[Row][Col] / RowSum / ColSum);
 end;
end;

function GetRowSum: Double;
begin
 Result := 0;
 for Col := 1 to ColCount do
   Result := Result + A[Row][Col];
end;

function GetColSum: Double;
begin
 Result := 0;
 for Row := 1 to RowCount do
   Result := Result + A[Row][Col];
end;


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

смысл такой :

есть процедуры, которые никак не могут вызывать друг друга и в момент работы одной из них никакая другая работать не будет (потоков не используется). Эти процедуры используют одинаковые переменные (тип, название). Вся программа только и состоит в том, что бывызывать эти процедуры. Переменные не обязательно для цикла. Есть функции, которые используют текущие значения этих переменных, не изменяя их.

я согласен : безопаснее все переменные держать локально и каждый раз передавать в функцию.
Но быстрее ли это?
И настолько ли плохо держать их глобально?


 
Игорь Шевченко ©   (2004-08-09 16:15) [136]


> И настолько ли плохо держать их глобально?


Уже несколько человек ответили, насколько плохо.
Для наколенных поделок можно и глобальными держать, коран не запрещает, компилятор тоже.


 
Danilka ©   (2004-08-09 16:17) [137]

[135] Prohodil Mimo ©   (09.08.04 16:12)
Дык, быстрее всего вообще функции/процедуры не использовать, зачем лишние команды вызовов/возвратов? :))
Все это, по моему скромному мнению, ерунда. Такая оптимизация. Выгадывать пару лишних тактов в ущерб всего.
Честно говоря, полтора года назад достался в наследство проект в котором часто использовались глобальные переменные, вобщем, все глюки победить так и не удалось, хотя по-возможности вычистил большинство глобальных перемен, но теперь я их просто-напросто ненавижу. :))


 
Anatoly Podgoretsky ©   (2004-08-09 16:18) [138]

Prohodil Mimo ©   (09.08.04 16:12) [135]
Значительно быстрее, вот когда потратишь недели на поиск ошибки, да еще и не найдешь, тогда поймешь, если захочешь понять.


 
Prohodil Mimo ©   (2004-08-09 16:22) [139]

[138] Anatoly Podgoretsky, за 8 лет такой проблемы ни разу не испытал


 
Яод   (2004-08-09 16:22) [140]

Сам когда-то занимался вылизыванием, еще на древнем паскале ради скорости и экономии.
Теперь смотришь на это и думаешь и зачем оно надо было?
Хотя графику в то время могли бы сделать пошустрее, где эта переносимость сейчас?


 
Anatoly Podgoretsky ©   (2004-08-09 16:24) [141]

Prohodil Mimo ©   (09.08.04 16:22) [139]
Позволю себе не поверить, закон бутерброда неотвратим.


 
Danilka ©   (2004-08-09 16:26) [142]

[141] Anatoly Podgoretsky ©   (09.08.04 16:24)
Ну почему-же. Смотря чем заниматься эти 8 лет. На очень маленьких проектах глабальные переменные может и не вылезут боком.


 
Prohodil Mimo ©   (2004-08-09 16:32) [143]

[141] Anatoly Podgoretsky, я не против.
Ну мож когда-нибудь и приспичит :о)

Я так понял, что писать надо удобно и не стараться ничего оптимизировать (всё равно компы сейчас быстрые, справятся) ?
Но когда запускаю прогу на старенькой машине сразу возникает желание оптимизировать, что бы хотя-бы на 30% работало быстрее.

Вот пришёл заказчик, хочет прогу, компы старые, а я должен сказать "обнови сперва машины, потом заходи" ?


 
Мастер ©   (2004-08-09 16:35) [144]

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

И что, все программы такие? Или других просто нет?


 
Anatoly Podgoretsky ©   (2004-08-09 16:35) [145]

Использование локальных переменных, особенно для циклов это и есть оптимизация, в плане скорости и размера потребной памяти.


 
Danilka ©   (2004-08-09 16:37) [146]

[143] Prohodil Mimo ©   (09.08.04 16:32)
Оптимизация, это совсем другое. Оптимизируются критичные по времени выполнения и/или объему места, а не передача параметров функции/процедуре. Вычищать параметры для оптимизации - все-равно что мухубойкой шлоепать слона пытаясь запихнуть его в чемодан.


 
Prohodil Mimo ©   (2004-08-09 16:53) [147]

[144] Мастер, вот любят тут к словам придираться.

Это был только пример.


 
Prohodil Mimo ©   (2004-08-09 17:03) [148]

Ветку уже надо переименовать в "Нужно ли бороться с Prohodil Mimo ?" :о)


 
Яод   (2004-08-09 17:11) [149]

Prohodil Mimo ©
боюсь ее оптимизируют удалением лишних веткописателей


 
Prohodil Mimo ©   (2004-08-09 17:21) [150]

И все ники вынесут глобально


 
Думкин ©   (2004-08-10 06:34) [151]

> Prohodil Mimo ©

Если между функциями начинает перемещаться огромное количество параметров, то есть смысл подумать о структуре, которую можно передавать по ссылке.
Вот ведь сколько в Windows структур и и т.д и т.п и работает.
Хотя уже предвижу выпады от иных - а потому и тормозит и вообще маст дай.
Но если подумать?


 
Prohodil Mimo ©   (2004-08-10 10:13) [152]

[151] Думкин.

Бедняга. Наверное не спал всю ночь :о)

Можно и твой вариант попробовать на тестах, посмотреть что будет. Как появится минутка - попробую. Ты же имел в виду указатель (pointer) на структуру (record)?


 
Думкин ©   (2004-08-10 10:14) [153]

> [152] Prohodil Mimo ©   (10.08.04 10:13)
> Бедняга. Наверное не спал всю ночь :о)

Не понял.


 
Sandman25 ©   (2004-08-10 10:16) [154]

[152] Prohodil Mimo ©   (10.08.04 10:13)

Скорее, var MyRecord или const MyRecord


 
Prohodil Mimo ©   (2004-08-10 10:34) [155]

[153] Думкин, не обижайся... это шутка была :о)
просто время 06:34 - довольно раннее :о)


 
Думкин ©   (2004-08-10 10:37) [156]

>  [155] Prohodil Mimo ©   (10.08.04 10:34)

Пол десятого я обычно не сплю. :)



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

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

Наверх




Память: 0.81 MB
Время: 0.032 c
3-1091521094
}|{yk
2004-08-03 12:18
2004.08.29
Что неправильно в такой инструкции?


6-1085536096
Пиво
2004-05-26 05:48
2004.08.29
Помогите сделать отправку письма в консольном приложении


9-1068180617
Google
2003-11-07 07:50
2004.08.29
DELPHIX


3-1091458329
sloug
2004-08-02 18:52
2004.08.29
Нужно просуммировать


8-1086007873
Serov Pavel
2004-05-31 16:51
2004.08.29
работа с Audio CD





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский