Использование той же ссылочной переменной против отдельных переменных.За счет ссылочной переменной в .Net - PullRequest
3 голосов
/ 01 декабря 2011

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

Я использую HtmlAgilityPack для анализа некоторых HTML-страниц.

В моем коде есть метод, который получает HtmlDocument и выполняет синтаксический анализ. В настоящее время код выглядит так:

private void OperateOnDocument (HtmlDocument pageSource)
{
  HtmlNode node;
  node = pageSource.DocumentNode.SelectSingleNode (/*XPath to find a node */);
  // do some operation on the extracted HtmlNode.

  node = pageSource.DocumentNode.SelectSingleNode (/* XPath to find another node */);
  // do some operation on the newly acquired node.

  // Likewise, reuse the same reference variable "node" to extract all the nodes and operate on them.
}

Плюсы: одна опорная переменная используется для работы на всех узлах.

Минусы: вы не знаете, какой узел извлекает отдельный разбор, так как все извлеченные узлы имеют разное значение и назначение (один узел может содержать скорость, другой может содержать название города).

Еще один способ сделать это:

private void OperateOnDocument (HtmlDocument pageSource)
{      
  HtmlNode idNode = pageSource.DocumentNode.SelectSingleNode (/*XPath to find the node containing id*/);
  // parse the text and store it in string.

  HtmlNode rateNode = pageSource.DocumentNode.SelectSingleNode (/* XPath to find the node containing the rates */);
  // parse the text into decimal.

  // Likewise, use separte meaningful names of reference variables to extract all the nodes and operate on them.
}

Плюсы: Отдельное значимое имя для каждого работающего узла.

Минусы: время от времени количество операций может увеличиваться до 10; следовательно, 10 различных ссылочных переменных.

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

Ответы [ 2 ]

3 голосов
/ 01 декабря 2011

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

Чтобы ответить на более конкретный вопрос, переменная не имеет никакого значения.внутренняя стоимость.Переменные не существуют в коде, который фактически выполняется на процессоре.Они являются конструкцией уровня источника, и компилятор не обязан создавать какое-то отображение 1-к-1 между переменными исходного кода и, скажем, push выполненными инструкциями, используемыми регистрами или чем-то еще.Одна переменная в вашем коде может соответствовать использованию нескольких разных регистров (время от времени компилятор может перемещать ее), или несколько разных переменных могут оказаться в одном и том же регистре, потому что они никогда не используются вв то же время.

Одна из многих функций, которые выполняет компилятор, - определение времени жизни переменной.Когда он используется впервые и когда он используется в последний раз?Не имеет значения, когда вы объявили об этом или когда он выходит из области видимости.

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

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

2 голосов
/ 01 декабря 2011

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

См. Также этот вопрос .

...