.NET中的点数有多贵?

2 .net c# vb.net pointers

过去,在C和C++版本中,如果在紧密循环中执行,嵌套指针解除引用被一些人认为是相对昂贵的操作.

你不会想被抓住:


for (int i = 0; i < 10000000; i++)
{
  j->k->l->m->n->o->p->dosomeworknowthatwereherewhynoteh();
}
Run Code Online (Sandbox Code Playgroud)

因为你可能会失去宝贵的毫秒数.(是的,我有点讽刺!)

转向.NET世界......

这更贵吗?


System.Runtime.InteropServices.Marshal.WriteInt32(Abort, 1)
Run Code Online (Sandbox Code Playgroud)

比这个?


Imports System.Runtime.InteropServices.Marshal
.
.
.
WriteInt32(Abort, 1)
Run Code Online (Sandbox Code Playgroud)

pli*_*nth 26

这是苹果和橘子的比较.

System.Runtime.InteropServices.Marshal.WriteInt32(Abort, 1)
Run Code Online (Sandbox Code Playgroud)

在C++中等效于此:

Foo::Bar::Baz::Func(a, b);
Run Code Online (Sandbox Code Playgroud)

换句话说,命名空间将命名空间折叠成零成本.

为了得到相同的东西,你可能有这样的东西:

public class Foo {
    public Person Agent { get; }
}

Foo f = getFooFromWhereEver();
f.Agent.Name.ToString().ToLower();
Run Code Online (Sandbox Code Playgroud)

在这种情况下,假设Person有一个名为Name的属性,它是一个字符串.在这种情况下,点链进行四次方法调用,其中至少有一种是虚拟的,但更可能不是所有这些都是不变的,因此多次调用它们是多余的.我说"更有可能......"因为这取决于Agent和Person的实现.


Fre*_*örk 9

命名空间中的点并不昂贵; 它们在编译时由编译器解析,而不是在运行时解析.(实际上它是另一种方式,挑剔;如果使用using/imports语句来缩短代码,类型引用将在编译时扩展为完整类型名称,包括命名空间).但是,达到属性或方法的点确实有成本.

这两个应该具有相同的性能:

System.Collections.Generic.List<string> myList = new System.Collections.Generic.List<string>();
// using System.Collections.Generic
List<string> myList = new List<string>();
Run Code Online (Sandbox Code Playgroud)

虽然重复访问财产的财产可能会花费:

for (int i = 0; i < 100000; i++)
{
    int n = this.ActiveControl.Size.Width;
}
// this should be faster
int width = this.ActiveControl.Size.Width;
for (int i = 0; i < 100000; i++)
{
    int n = width;
}
Run Code Online (Sandbox Code Playgroud)


Toa*_*oad 5

在您的示例情况下,使用导入,没有区别.imports语句只是确保您不必每次都输入完整路径.

但是,如果你写了:

 for(i=0; i<10000; i++)
 {
      classInstance.memberclass.memberclass.memberclass.memberclass.writeInt32(bla);
 }
Run Code Online (Sandbox Code Playgroud)

然后是的,写作可能会更好:

 SomeClass someclass = classInstance.memberclass.memberclass.memberclass.memberclass;
 for(i=0; i<10000; i++)
 {
      someClass.writeInt32(bla);
 }
Run Code Online (Sandbox Code Playgroud)