Любой язык: переработка Переменные - PullRequest
3 голосов
/ 15 ноября 2010

Это кажется простым вопросом, но стоит ли вообще повторно использовать переменные в любом языке сценариев?

Меня особенно интересуют причины, почему это / не является хорошей практикой, так как я, кроме себя, должен или не должен это делать.

Например, $i - одна из самых распространенных переменных, используемых в цикле для итерации.

Eg (в php):

//This script will iterate each entry in $array 
//and output it with a comma if it isn't the last item.

$i=0;    //Recycling $i

foreach ($array as $v) {
    $i++;

    if ($i<count($array))
    {
        echo $v.', ';
    }
    else {
        echo $v;
    }
}

Скажем, у меня в сценарии несколько циклов, было бы лучше повторно использовать $i или просто использовать другую переменную, такую ​​как $a, а для любых других циклов перейти от $b к $z.

Очевидно, что для повторного использования $i мне нужно было бы установить $i=0; или null перед циклом, иначе в дальнейшем в скрипте получилось бы очень странное поведение. Что заставляет меня задуматься, стоит ли многократно использовать его ...

Будет ли следующее занимать больше места, чем просто использование другой переменной?

$i=0;    //Recycling $i

Конечно, это самый простой пример использования, и я хотел бы знать о том, был ли сценарий ужасно более сложным, не вызовет ли он больше проблем, чем он стоит?

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

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

Ответы [ 5 ]

2 голосов
/ 15 ноября 2010

Вы должны инициализировать $i до 0, прежде чем войти в цикл foreach, независимо от того, использовали ли вы его ранее в функции и независимо от используемого вами языка. Это просто не зависящая от языка лучшая практика.

Многие языки помогают вам обеспечить это, позволяя привязать переменную подсчета к области действия цикла for. PHP foreach предоставляет аналогичный механизм, если ваш массив основан на 0 и содержит только цифровые ключи:

foreach ($array as $i => $v) {
    echo $v;

    if ($i + 1 < count($array))
        echo ', ';
}

Кроме того, что касается вашего заявления:

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

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

2 голосов
/ 15 ноября 2010

Я думаю, вы перепутали строку с переменной.Строка - это набор символов ASCII или Unicode, в зависимости от языка программирования.Переменная - это именованное место в памяти.Итак, вы говорите об утилизации переменной, а не строки.

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

Большинство языков имеют концепцию области видимости, при этом переменное пространство выделяется при объявлении и освобождается по окончании области действия.Если вы сохраняете переменную в надлежащей области видимости, вам не придется беспокоиться о напрасной трате памяти, поскольку переменные будут освобождены, когда они больше не нужны.Опять же, специфика объема зависит от языка.

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

1 голос
/ 15 ноября 2010

Это зависит от проблемы, которую вы решаете.

При использовании PHP (и других языков сценариев) вы должны учитывать unset () для значимых переменных, таких как массивы или длинные строки.Вы не должны беспокоиться о повторном использовании или обнулении небольших переменных (целое число / логическое значение / и т.д.).Это не стоит того, чтобы использовать (медленный) язык сценариев.

Если вы разрабатываете приложение, критичное к производительности, на языке низкого (более низкого) уровня, таком как C, повторное использование переменной более важно.

1 голос
/ 15 ноября 2010

Лично у меня нет проблем с повторным использованием переменных индекса / счетчика - хотя в некоторых языках, например .Net, использование переменной в цикле for специально определяет область действия этого цикла - так что она впоследствии очищается, несмотря ни на что.

Вы никогда не должны повторно использовать переменные, которые содержат какие-либо важные данные (это не должно быть проблемой, поскольку все ваши переменные должны иметь описательные имена)

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

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

Dim MyString as String = "Something"
MyString = "SomethingElse"

Фактически выделит новую область памяти для хранения 2-го использования и изменит указатель MyString, чтобы он указывал на новое местоположение.

Кстати, вот почему следующее действительно неэффективно (по крайней мере, в .Net):

Dim SomeString = SomeVariable & " " & SomeOtherVariable

Это выделяет память для SomeVariable, затем больше памяти для SomeVariable + " ", а затем еще раз для SomeVariable + " " + SomeOtherVariable - то есть SomeVariable фактически записывается в память 3 раза.

Итак, очень простые переменные для циклов, которые я бы использовал повторно. Что-нибудь еще, я бы просто назначил новые переменные - тем более, что выделение памяти обычно занимает лишь небольшую долю времени / обработки большинства приложений.

Помните: Преждевременная оптимизация - корень всего зла

1 голос
/ 15 ноября 2010

Сброс вашей переменной ($ i = 0) не займет больше места.

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

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

Хорошей идеей является повторное использование индексной переменной для взаимоисключающих циклов; это делает ваш код легче для понимания. Если вы объявляете много дополнительных переменных, другие люди, читающие ваш код, могут задаться вопросом, используется ли «i» для чего-то еще даже после завершения вашего цикла.

Повторно используйте это! :)

...