内存分配类的自动属性

时间:2018-03-14 13:55:25

标签: c# asp.net .net asp.net-mvc web-services

我有一个具有多个属性的类。例如

public class Customer
    {
        public int id { get; set; }
        public string abc{ get; set; }
        public bool abcd { get; set; }
        public string abcde { get; set; }
        public string abcdef { get; set; }
        public string abcdefg { get; set; }
        public string abcdefgh { get; set; }
        public string xyz { get; set; }     
    }

现在我想知道get set属性消耗了多少内存空间。 我只在我的一个API调用中需要很少的属性,而在另一个API调用中需要所有这些属性。 所以我想知道是否应该创建两个不同的类并将它们用于我的单独API调用,或者只使用一个具有多个get set属性的公共类,并将其用于我的API调用。 任何指导将不胜感激。感谢

2 个答案:

答案 0 :(得分:1)

intbool通常会被打包成8个字节; string引用需要4(32位)或8(64位)作为引用。如果字符串具有非空值,则该空间将单独分配,并且将是字符串所需的任何内容。

但坦率地说:除非你分配百万,否则将它分成两种不同的类型不会为你节省任何真正的 - 它只会是牦牛剃须。特别是对于字符串为null的情况。

答案 1 :(得分:0)

我们必须排除字符串。这个可以是" null"到了#34;无论今天的字符串最大长度是什么"。

理论上,自动实现属性的成本应该与最小的手动属性相同:一个支持字段。整个类型的一个get和一个set函数。关于属性的最重要的一条规则是不要意外地访问类代码中的支持字段。并且自动实现属性可以通过简单地不为后备字段提供您可以使用的名称来实现。它仍然存在。它可能具有从Reflection的Property属性派生的名称。但是你的代码没有真正的方法来访问它。

理论上,因为现在是京都的系数。 JiT可以做很多优化:

  • 这些自动访问器的代码非常少。因此Inlining them的成本低于调用它们的成本的可能性很大。因此,我认为JiT将有90%的机会内联。​​
  • 如果您创建一个临时变量以在下一行使用它,则此变量可能会遇到DeadCode检测。这意味着它将被切断并由原始访问权限取代。
  • 但是对于腐败来说,它也是另一回事。为了绕过ArrayBounds Checks中固有的开销,JiT可能会检测到多余的Acesses"使用相同的索引并创建一个临时变量来使用。

虽然我还没有读过它,但我不排除JiT甚至可以从类中删除未使用的属性。这只是运行时优化。它至少可以将未访问的varriable(及其初始化)作为死代码删除。正如我在尝试强制使用2 GiB OOM时发现的那样:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace OOM_32_forced
{
    class Program
    {
        static void Main(string[] args)
        {
            //each short is 2 byte big, Int32.MaxValue is 2^31.
            //So this will require a bit above 2^32 byte, or 2 GiB
            short[] Array = new short[Int32.MaxValue];

            /*need to actually access that array
            Otherwise JIT compiler and optimisations will just skip
            the array definition and creation */
            foreach (short value in Array)
                Console.WriteLine(value);
        }
    }
}

我同意这是Micro Optimisations。但更重要的是,这些可能是JiT可以为你做的已经。所以你可以根本不保存任何东西。就个人而言,我更喜欢在优化之前对代码方式进行读取和调试。我经常可以做些什么"无效"因为我可以在知识中休息,JiT将适当地处理它。