Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Объявление переменной вне цикла-имеет ли смысл, с точки зрения производительности 
:(
    Опции темы
Rockie
Дата 11.10.2011, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: нет
Всего: 31



Добрый день!

Пишу например такой код(присоединяем к мылу несколько вложений):

Код

            MailAttachment attachment = null;

            for (int i = 0; i < counter; i++)
            {
                attachment = new MailAttachment(@"c:\attachment.html");

                // дальше производим какие-то действия - присоединяем к письму, не суть важно
                // ..
            }


поставил ReSharper 6. он выдает мне рекомендацию и предлагает сделать "Move declaration closer to usage". Тогда код получится такой:

Код

            for (int i = 0; i < counter; i++)
            {
                MailAttachment attachment = new MailAttachment(@"c:\attachment.html");

                // дальше производим какие-то действия - присоединяем к письму, не суть важно
                // ..
            }


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


--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
ToLive
Дата 11.10.2011, 18:56 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 21.12.2006

Репутация: нет
Всего: нет



Я еще совсем новичек в программировании, но риску предположить, что в в первом случае ссылка на объект останется после выхода из цикла и не будет еще подлежать сборке мусора. Во втором же случае, по выходе из цикла все созданные объекты сразу могут быть утилизированы сборкой мусора (когда она запустится).

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

Очень интересно услышать мнение авторитетных людей smile
PM MAIL   Вверх
Rockie
Дата 12.10.2011, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: нет
Всего: 31



Спасибо за ответ!

В общем спрашивал я примерно следующее - по аналогии с C++-овой логикой в первом случае ресурсы в цикле выделяются под один участок памяти, а во втором под разные(что захламляет память). Либо в .NET это не суть важно и поэтому решарпер и предлагает мне сделать код читабельней.

В общем насколько я сейчас понял, в .NET сборщик мусора работает с так называемой "кучей", в которой двигает объекты. То есть в первом случае абсолютно не факт что объект будет лежать на том же месте. Так что решарпер получается прав и остается писать как удобнее). Кому интересно могу кинуть линк на обсуждение.


--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Ptica_Oz
Дата 12.10.2011, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 1.3.2007

Репутация: нет
Всего: нет



Цитата(Rockie @ 12.10.2011,  11:10)
В общем насколько я сейчас понял, в .NET сборщик мусора работает с так называемой "кучей", в которой двигает объекты. То есть в первом случае абсолютно не факт что объект будет лежать на том же месте.

Ну и что с того? Как это сказывается на производительность?  Если объясните, буду признательна.
А вообще мне интересно, дайте, пожалуйста линк.  smile 
PM MAIL   Вверх
СерегаГоляков
Дата 12.10.2011, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Всё супер :)
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 26.4.2010
Где: НСК

Репутация: нет
Всего: нет



Думается, если сообщения отправляются ну ооооочень часто, то лучше её попределить зарание.
--------------------
Список всех полезных программ в ОДНОЙ программеhttps://sites.google.com/site/coolprogramms...latnyh-programm...Пьяные белазисты в карьереhttp://www.youtube.com/watch?v=6FGNGMwxJZ4
PM WWW   Вверх
Rockie
Дата 12.10.2011, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: нет
Всего: 31



Правильней мне стоило выразиться "с точки зрения расхода памяти". Или "в связи с многократным выделением памяти в цикле". 


--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
mes
Дата 12.10.2011, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 1
Всего: 250



Цитата(Rockie @  12.10.2011,  10:10 Найти цитируемый пост)
по аналогии с C++-овой логикой в

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



--------------------
PM MAIL WWW   Вверх
Voyager
Дата 20.10.2011, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 532
Регистрация: 8.2.2005

Репутация: 3
Всего: 18



Никакой разницы, оба способа одинаковы с точки зрения производительности, компилятор в обоих случаях создаст локальную переменную метода.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0535 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.