分配变量的成本

时间:2012-08-29 18:16:50

标签: c# performance linq data-structures

var addr = (from s in context.Addresses
            where (s.u_address_id == new Guid(this.Id).ToString("B"))
             select s).Single();    
Address Addr = new Address(addr.u_address_id);

将linq结果分配给变量而不是直接在我的用法中调用它的成本是多少,如下所示?

Address Addr = new Address(((from s in context.Addresses
                             where (s.u_address_id == new Guid(this.Id).ToString("B"))
                             select s).Single()).u_address_id);

4 个答案:

答案 0 :(得分:4)

执行时间或空间消耗有成本。在任何一种情况下,短时间内都需要存储位置。一些堆栈槽或寄存器简要用于存储对.Single()调用结果的引用,并将其传递给构造函数。之后(假设您不再使用该变量,这是非常隐含的),它不是必需的,可以(将)重复使用。

更多相关因素可能是可读性,线路长度,编码标准等。

答案 1 :(得分:2)

无。他们都做了同样的事情,但是一个人会命名一个本来会被隐藏的地方。

如果你因为削减每一小笔费用而疯狂,那么为什么不这样做:

Address Addr = new Address((from s in context.Addresses
  where (s.u_address_id == new Guid(this.Id).ToString("B"))
  select s.u_address_id).Single());

没有得到所有的领域都会产生影响,绝对是微不足道的,通过相当微小到足以让它几乎重要。

更好:

string add_id = new Guid(this.Id).ToString("B");
if(context.Addresses.Count(s => s.u_address_id == add_id) != 1)
  throw new InvalidOperationException();
Address Addr = new Address(add_id);

(对于某些来源,.Where(s => s.u_address_id == add_id).Take(2).Count()更好,而其他人没有。)

或者如果你可以确信源中存在这样的项目,你可以这样做:

Address Addr = new Address(new Guid(this.Id).ToString("B"));

其中没有一个是大规模的,但它们比提供临时名称的关注要大得多。我认为他们也越来越清楚他们实际上在做什么。我认为是最后一个,最具可读性的。

答案 2 :(得分:1)

确实没有多少成本。在第一种情况下,您可能(但可能不会)在堆栈中占用一两个字的内存,但在成本方面这几乎可以忽略不计。可读性在两者之间略有不同,这总是有点主观。在这里我要说的是,它在两行上更具可读性,并且当你没有为每行代码做太多时,它可能更容易调试。

答案 3 :(得分:1)

好吧,假设变量没有被编译器或JIT优化掉。然后你开始担心在RAM或寄存器中存储4或8字节(32或64位)。

将其与您的代码的其余部分进行比较,其中您的查询即时转换为SQL,通过网络发送到数据库服务器,由数据库服务器解析,由数据库服务器执行,结果通过网络发回,结果具体化为您可以使用的对象。

你还担心4字节的分配吗?我不是。