.net - 使用相同的引用变量与单独的变量。 .Net中引用变量的费用

标签 .net reference language-design

我不确定这个问题是不是很傻,但我真的很想得到一些意见。我将直接提供我目前正在从事的工作的示例。

我正在使用 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 中的这些变量有多昂贵?或一般的任何其他语言/框架?

最佳答案

如果您担心做某事的成本,请衡量一下。如果您无法衡量差异,那么差异可能无关紧要(如果它重要,您将能够衡量它)。

为了回答您更具体的问题,变量没有任何内在成本。实际在 CPU 上执行的代码中不存在变量。它们是源代码级别的构造,编译器没有义务在源代码变量与执行的 push 指令或使用的寄存器或任何其他内容之间创建某种一对一的映射别的。代码中的单个变量可以对应于几个不同寄存器的使用(编译器可能会不时选择移动它),或者几个不同的变量可能最终共享同一个寄存器,因为它们从未在同时。

编译器所做的许多事情之一就是确定变量的生命周期。什么时候第一次使用,什么时候最后一次使用?您何时声明它或何时超出范围都没有关系。

编译器通常使用的将代码转换为更易于优化的形式的转换是将每个赋值转换为一个新的、唯一的变量,基本上就像你的第二个例子一样。这就是编译器更喜欢处理代码的方式,因为现在它可以清楚地看到依赖关系。在第一种情况下,看起来好像同一个变量必须存在于整个函数中,并且在两个操作中重复使用。在第二种情况下,我们可以很容易地看出它们是独立的、独立的变量,并且我们可以看出它们的生命周期没有重叠(idNoderateNode< 的声明之后没有被使用)/)。

这两个版本可能会生成完全相同的代码,但第二个版本更接近于优化编译器在内部对代码执行的操作。

关于.net - 使用相同的引用变量与单独的变量。 .Net中引用变量的费用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8338864/

相关文章:

c# - C# 类库中对象的类、方法、变量大小写/名称的最佳实践是什么?

mysql - 创建表架构错误 - 不确定为什么会出现架构错误

java - 每当我编译时,输出都会引用内存中的某个位置(Java)

c# - c# 是否有任何语句不遵循从左到右的评估顺序?

c# - 在哪里可以找到 Windows.UI.Xaml.Media.Imaging 命名空间?

.net - 解析 SAP IDOC 文件

c# - 如何将相同的 VisualState 应用于多个控件?

list - 在 Perl 中对列表进行自定义重新排序/排序,时间复杂度为 O(n)

c++ - unique_ptr - 重大改进?

multithreading - 混合线程模型(M :N) Implementation