c#没有指针导致的性能问题研究一二

 

题目起的好吧。

结构类型可以在栈分配空间,而引用类型只能分配指针。

通过数组,结构类型可以分配一个连续的空间和一个指针。

数组结合引用类型只能分配连续的指针,和零散的空间。这是性能问题的一个潜在点。

因此要做序列化的东西,而又比较在意性能,数组结合结构类型是有必要的。

没有指针,可以用下标来访问,也就是枚举数组的元素,需要返回数组本身(指针)和他当前的下标(自然数)两样东西,这没有指针方便,但基本可以满足要求。

问题是,很多数据结构的api并不返回数组和下标,而是返回值本身。如果该值是引用类型,那么还能当指针来使用,如果该值是值类型,那就不能枚举元素了。

也许我们不需要枚举元素,只需要改变元素,提取值类型元素就是克隆一份这种设定,也是性能问题的潜在点。

想返回指针而不是值怎么办?返回可以访问它的对象和访问的方法参数。

如二叉树,节点对象持有值类型,而有两个指针指向左右节点。一般数据结构api返回值,那么你就无法修改该节点的。唯一的方法是你返回该节点。

如数组,节点是值,返回值就无法修改这个节点的值,而需要返回数组,和该节点的下标。

.net自带的类库我们没办法更改,但是要实现高性能的数据结构,就需要考虑提供引用访问的接口,避免无意义的复制。

c#自带的可枚举类型(IEnumerable),枚举器(IEnumerator)类似以上概念,但是返回的当前枚举所持有的值是不可修改的,第二,它是一个遍历用途的工具,从0开始,而不是从你需要使用的项开始。比如你想返回数组第3项,但是可枚举类型会返回一个枚举器,它的下标是从-1开始的。

理想的设计应该类似是:

class Tor<Node,T>{

Node node;

int i;

pubulic T Value{get{return node[i];}set{node[i] = value}}

public bool move(){if(node.Length > i){i++;return ture;}else return flase;};

public Tor(Node n, int index){node = n; i = index);

}

 

static void main(){

int [] m  = {0,1,2,3,4};

Tor<int[],int> t = new Tor(m, 2);

t.Value = 5;

while (t.move) t.Value  = 0;

List<int> list = new List<int>(Enumerable.Rangle(0,4));

Tor<List<int>,int> t = new Tor(list, 2);

}

 

posted @ 2013-04-09 13:52  诺贝尔  阅读(1069)  评论(0编辑  收藏  举报