.NETBoxing/UnboxingandCastingPerformance我试图从性能的角度了解这两种解决方案中哪一种更受欢迎。比如我有两段代码:1)装箱/拆箱intval=5;会话[“密钥”]=val;intval2=(int)Session["key"];2)Casting(IntObj有int属性来存储int)IntObjval=newIntObj(5);会话[“密钥”]=val;intval2=((IntObj)Session["key"]).Value;这些示例之间的内存管理区别是什么?有没有更快的方法来做这样的事情?注意:会话只是一个例子,它可以是任何字典看起来你在这里真正做的是比较手动装箱和内置装箱。内置装箱已经高度优化-所以我不希望在这里看到巨大的差异,但我们可以检查一下。重要的是要注意两者具有相同的内存影响:堆对象包含一个int字段,每个int装箱/包装。下图显示两个关闭时间几乎相同;因此,我会说,只是直接/内置的方式。注意:在发布模式下运行它,没有调试器(最好在命令行)。请注意,第一个调用预JIT一切。使用系统;使用系统诊断;publicsealedclassIntObj{publicreadonlyintValue;publicIntObj(intvalue){值=值;}}staticclassProgram{staticvoidMain(){Run(1,0,false);运行(100000、500、真);控制台.ReadKey();}staticvoidRun(intlength,intrepeat,boolreport){vardata=newobject[length];intchk=0;varwatch=Stopwatch.StartNew();for(intj=0;j那么什么更快,DIY装箱vs.IntObj或内置装箱?我的猜测是内置多重性。可能两个编译器都经过优化来处理它。是否有更多的“快速"做这样的事情的方法?对于大数据集,首选的方法是避免它。对于小数据集,没关系。最快的做法是不做。尝试重组你的数据来避免很多装箱以同时提高类型安全性、可读性和潜在性能。我发现您不太可能需要在无类型字典中存储大量不相关的整数(或其他值类型)元素。通常值被组织为一些组合在一起的对象,在这种情况下,您将顶级对象存储在一个无类型的字典中,只需要一次转换。对于更深层次的元素,您可以使用强类型类,如Dictionary)因为这个问题已经解决,因为没有装箱必需的。如果你觉得在你的情况下你真的需要在一个string=>opbjectmap中存储大量的int(或其他值类型元素),那么你应该很容易使用你的数据集和目标进行测量,看看是否有这两个版本都有很大的好处。如果两者都符合您的目标(比如)——选择产生最易读代码的那个(即对我来说它将是第一个变体)。我对C#cast运算符生成的不同类型的IL指令进行了分类:通过继承层次结构(如C++中的dynamic_cast,使用castclassIL指令)验证装箱(装箱IL指令)和拆箱(拆箱IL指令)以在原始类型之间转换(比如C++中的static_cast,对于不同类型的IL指令,原始类型之间存在大量的强制转换)调用用户定义的转换操作符(在IL层面,它们只是强制转换为op_XXX方法对应的方法调用)。不同之处在于cast在创建新的引用类型时会分配额外的内存。以上就是《C#学习教程:.NET打包/拆箱与铸造性能分享》的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注---本文来自网络收集,不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
