zoukankan      html  css  js  c++  java
  • 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);

    }

  • 相关阅读:
    Linux下查看网卡驱动和版本信息
    HTML <!--...--> 标签
    linux物理网卡检测命令mii-tool
    Git错误non-fast-forward后的冲突解决
    ubuntu上解决访问github慢的方法
    右侧添加悬浮打赏功能
    VSCode 预览 .md 文件
    Matlab绘制三维曲面(以二维高斯函数为例)
    matlab的三维绘图和四维绘图
    ubuntu查看文件和文件夹大小
  • 原文地址:https://www.cnblogs.com/Nobel/p/3009972.html
Copyright © 2011-2022 走看看