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);
}