c # встроенные аргументы функции и временные переменные - PullRequest
2 голосов
/ 05 января 2012

Мне было интересно узнать о следующей ситуации в C #.

Иногда имена функций могут быть довольно длинными и многословными.Я использую Microsoft MVC 3 Framework для веб-сайта на работе. Вот пример функции:

[ImportModelStateFromTempData]
[BreadCrumb("New Event")]
public ActionResult New()
{
    var @event = _dbContext.EventRepository.CreateNewEvent();

    return View("New", 
        EventViewModel.FromEventDomainModel(@event));
}

Этот код можно переписать без использования временных переменных @event, например:

[ImportModelStateFromTempData]
[BreadCrumb("New Event")]
public ActionResult New()
{
    return View("New", 
        EventViewModel.FromEventDomainModel(_dbContext.EventRepository.CreateNewEvent()));
}

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

В C ++ я помню, что обнаружил, что объявление локальной переменной @event (если бы это было C ++) будет храниться в стеке New ()frame, и сгенерированная сборка будет МЕДЛЕННО медленнее, чем прямая вставка аргумента (в отличие от временного хранения его).

Разумнее ли в этой ситуации компилятор C #?Могу ли я использовать временные без таких же соображений производительности?

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

Ответы [ 2 ]

4 голосов
/ 05 января 2012

IL, произведенный ими, будет эквивалентен.Если вы хотите доказать это сами, попробуйте скомпилировать оба и посмотреть на полученный IL с Ildasm http://msdn.microsoft.com/en-us/library/f7dy01k1(v=vs.80).aspx

3 голосов
/ 05 января 2012

Временные переменные хороши.

Когда вы отлаживаете, вы можете проверить результаты функций.

Задержка, если она есть, указана в нано или пико секундах.

Техническое обслуживание - король.

...