C#   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了C#中小类的内存优化大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一段代码将大字符串矩阵转换为MyClass的大矩阵. MyClass是我写的一个小类,它存储了关于每个字符串的一些信息,如下所示:

class MyClass
{
    public MyEnum Class { get; private set; }

    public int a { get; private set; }
    public int B { get; private set; }
    public int C { get; private set; }
    public int D { get; private set; }
}

目前该软件能够处理大至5-20列×100万行的矩阵,但我想将行数增加到接近1000万.我不相信我可以做很多事情来减少字符串矩阵的占用空间,但我想减少MyClass的内存占用.

我可以使用short作为列A的类型,使用byte作为B,C和D的类型,尽管这需要相当大的代码重构.

我的问题,或者说是问题:

>是否值得重构代码以使用short和byte?
>我还应该将MyEnum重构为字节类型吗?
>我还能做些什么来提高课程效率吗?

非常感谢您的时间!

编辑:多一点上下文 – MyClass的矩阵是从字符串矩阵创建的,用于分析.字符串矩阵通过普通网络连接从文本文件中拉出,因此将任务拆分为较小的块并不理想.

解决方法

@H_674_26@ 截至目前,假设您的所有属性都是由实例变量实现的,并且您在64位机器上运行,MyClass的实例是4B * 4 8B = 24B.
此外,由于您使用的是类(引用类型),因此MyClass的矩阵每个单元的权重将进一步增加8B.这意味着您每个单元使用32B.然后,一个10Mx20的MyClass矩阵使用大约6.4GB(这些大小,你必须使用64位二进制),它可能不止于此,因为我忽略了内存对齐要求.

如果从类切换到结构(值类型),矩阵将直接存储MyClass实例,而不是指向MyClass实例的指针.因此,您将为每个实例保存8B.
现在,内存使用率降至4.8GB.

如果您进一步调整实例变量,使用1个短3个字节,并将枚举转换为字节,则每个实例仅使用6B.因此,总内存使用量将降至1.2GB.

无论如何,它将不止于此,因为托管环境在每个对象中存储了一些其他元数据,并且因为内存对齐需要填充对象以获得更快的访问时间.

PS:您实际上不需要更改属性的返回类型.您可以封装类型更改,并在MyClass的实现中执行强制类型转换,如:

struct MyClass
{
  private short a; //Also consider ushort,if you need it
  //...

  public int a
  {
    get { return a; //Automatic promotion }
    private set
    {
      a = (short) value;
      System.Diagnostics.Debug.Assert(a == value,"Integer overflow");
    }
  }

  //...
}

这样,优化对使用MyClass的代码是透明的.

大佬总结

以上是大佬教程为你收集整理的C#中小类的内存优化全部内容,希望文章能够帮你解决C#中小类的内存优化所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。