过去,在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的实现.
命名空间中的点并不昂贵; 它们在编译时由编译器解析,而不是在运行时解析.(实际上它是另一种方式,挑剔;如果使用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)
在您的示例情况下,使用导入,没有区别.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)
| 归档时间: |
|
| 查看次数: |
588 次 |
| 最近记录: |