C#中谁最快:结构还是类?

640?wx_fmt=jpeg

前言

在内存当道的日子里,无论什么时候都要考虑这些代码是否会影响程序性能呢?
在现在的世界里,几乎不会去考虑用了几百毫秒,可是在特别的场景了,往往这几百毫米确影响了整个项目的快慢。
通过了解这两者之间的性能差异,希望帮助大家在合适的场景里选择正确的编码。

实例

Copy

public class PointClass
{
public int X { get; set; }
public int Y { get; set; }
public PointClass(int x, int y)
{
X = x;
Y = y;
}
}

public class PointClassFinalized : PointClass
{
public PointClassFinalized(int x, int y) : base(x, y)
{
}
~PointClassFinalized()
{


}
}

public struct PointStruct
{
public int X { get; set; }
public int Y { get; set; }
public PointStruct(int x, int y)
{
X = x;
Y = y;
}
}

public class StructsTest : PerformanceTest
{
protected override bool MeasureTestA()
{

var list = new PointClassFinalized[Iterations];
for (int i = 0; i < Iterations; i++)
{
list[i] = new PointClassFinalized(i, i);
}
return true;
}

protected override bool MeasureTestB()
{

var list = new PointClass[Iterations];
for (int i = 0; i < Iterations; i++)
{
list[i] = new PointClass(i, i);
}
return true;
}

protected override bool MeasureTestC()
{

var list = new PointStruct[Iterations];
for (int i = 0; i < Iterations; i++)
{
list[i] = new PointStruct(i, i);
}
return true;
}
}

有一个PointClass和一个 PointStruct
,这两者用于存放X 和Y 两个变量,而且还有一个 PointClassFinalized

方法 MeasureTestA 创建了100万个 PointClassFinalized 实例

方法 MeasureTestB 创建了100万个 PointClass 实例

方法 MeasureTestC 创建了100万个 PointStruct 实例

您认为哪种方法最快?

640?wx_fmt=png

MeasureTestB 和 MeasureTestC 这两个方法的唯一不同在于一个是创建类 一个是创建结构。

MeasureTestC 仅在17毫秒内完成分配并运行,比 MeasureTestB 方法快8.6倍!

为什么会出现这样的事情,这里发生了什么?

不同的在于结构和类如何存储在内存中。

下面是 PointClass 实例 内存布局:

640?wx_fmt=png

该列表是一个局部变量,存放在堆栈中。引用堆上的一组 PointClass实例

PointClass 是一个引用类型,存放在堆上。

该列表仅维护一个数组,指向存储在堆上 PointClass 实例。

观察到上图的黄色箭头,在堆上引用了很多实例。

数组是一组相同的对象,MeasureTestB 这个方法是将一组相同的对象存放在数组中。

当访问指定数组元素时,.NET运行时需要检索对象引用,然后“跟随”引用以获取PointClass实例。

当数组元素超出范围时,.NET垃圾收集器就会开始回收PointClass对象内存,在 MeasureTestA 方法中 的PointClassFinalized类 其实增加了额外时间。

.NET Framework在单个线程上运行所有终结器,线程必须在垃圾回收器可以回收内存之前依次处理1,000,000个对象。

可以看到MeasureTestAMeasureTestB慢1.7倍。

我们来看看 PointStruct 的内存布局:

640?wx_fmt=png

结构是值类型,所有 PointStruct 实例都存储在数组本身中。堆上只有一个对象。

初始化数组,.NET运行库可以将X和Y值直接写入数组里。无需在堆上创建新对象,也不需要引用它。

当访问指定数组元素时,.NET运行时可以直接检索结构。

当超出范围时,.NET垃圾回收器只需要处理单个对象。

总结

我们总要使用结构吗?要分情况看:

  • 当您存储超过30-40个字节的数据时,请使用类。

  • 存储引用类型时,请使用类。

  • 当您存储多于几千个实例时,请使用类。

  • 如果列表是长的生命周期的,请使用类。

  • 在所有其他情况下,使用结构。

原文:https://www.cnblogs.com/luquanmingren/p/11263161.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 

640?wx_fmt=jpeg


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314665.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二进制状态压缩DP

描述 给定一张 n 个点的带权无向图&#xff0c;点从 0~n-1 标号&#xff0c;求起点 0 到终点 n-1 的最短Hamilton路径。 Hamilton路径的定义是从 0 到 n-1 不重不漏地经过每个点恰好一次。 输入格式 第一行输入整数n。 接下来n行每行n个整数&#xff0c;其中第i行第j个整数表示…

阅读nopcommerce startup源码

创建一个asp.net core项目&#xff0c;可以到到startup类有两个方法// This method gets called by the runtime. Use this method to add services to the container.public void ConfigureServices(IServiceCollection services)public void Configure(IApplicationBuilder a…

HDU - 7073 Integers Have Friends 2.0 随机化 + 质因子

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个序列aaa&#xff0c;找一个最大的集合&#xff0c;集合中所有元素模mmm相等。 思路&#xff1a; 之前做过一道连续的&#xff0c;直接尺取就好&#xff0c;这个不连续加大了难度。 考虑最简单的…

OpenJudge:熄灯问题

题目链接 大意就是&#xff0c;摁一个开关&#xff0c;它的前后左右以及他自己的状态都会改变。 原本是开的变成关的&#xff0c;原本是关的变成开的。 我们的任务就是把所有的灯都变成关闭状态。 我们可以这样想象&#xff0c;第一排的灯已近摁完了&#xff0c;确实是正确答案…

一份关于.NET Core云原生采用情况调查

调查背景Kubernetes 越来越多地在生产环境中使用&#xff0c;围绕 Kubernetes 的整个生态系统在不断演进&#xff0c;新的工具和解决方案也在持续发布。云原生计算的发展驱动着各个企业转向遵循云原生原则&#xff08;启动速度快、内存占用低&#xff09;的平台&#xff0c; .N…

BBQ Hard dp + 组合数学 + 建模

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 有nnn组物品&#xff0c;每组有aia_iai​个肉和bib_ibi​个菜&#xff0c;你可以选择两组物品让后将肉和菜其串在一根串上&#xff0c;问有多少种不同的串法。 两种方法不同当且仅当选的物品不同或者串的顺序…

差分:最高的牛

最高的牛 有 N 头牛站成一行&#xff0c;被编队为1、2、3…N&#xff0c;每头牛的身高都为整数。 当且仅当两头牛中间的牛身高都比它们矮时&#xff0c;两头牛方可看到对方。 现在&#xff0c;我们只知道其中最高的牛是第 P 头&#xff0c;它的身高是 H &#xff0c;剩余牛的身…

KPI在小型产品团队中的实践

最近公司决定对所有技术人员实行KPI考核&#xff0c;曾经一度非常反感KPI的我也被要求制定产品团队的KPI指标。为什么要实行KPI考核&#xff0c;因为在项目团队和产品团队的管理中出现了问题&#xff1a;不同项目团队的开发人员的工作量饱和度问题&#xff0c;阶段性会出现有的…

HDU - 7084 Pty loves string kmp + fail树 + 主席树

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个字符串sss&#xff0c;有qqq个询问&#xff0c;每次给x,yx,yx,y代表取sss的前xxx个字符和后yyy个字符拼接起来得到ttt&#xff0c;输出ttt在sss中出现的次数。 n,q≤2e5n,q\le2e5n,q≤2e5 思路&…

历久弥新 - 微软万亿市值背后的文化支撑(上)|DevOps案例研究

内容来源&#xff1a;DevOps案例深度研究-Microsoft文化支撑研究战队&#xff08;本文只展示部分PPT研究成果&#xff0c;更多细节请关注案例分享会&#xff0c;及本公众号。&#xff09;本案例内容贡献者&#xff1a;陈飞&#xff08;Topic Leader&#xff09;、陈雨卿、郭子奇…

Educational Codeforces Round 72 (Rated for Div. 2) D. Coloring Edges dfs树/拓扑找环

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一张图&#xff0c;你需要给这个图的边染色&#xff0c;保证如果有环那么这个环内边的颜色不全相同&#xff0c;输出染色方案和用的颜色个数。 n,m≤5e3n,m\le5e3n,m≤5e3 思路&#xff1a; 经过分析不…

ASP.NET Core on K8S深入学习(1)K8S基础知识与集群搭建

在上一个小系列文章《ASP.NET Core on K8S学习初探》中&#xff0c;通过在Windows上通过Docker for Windows搭建了一个单节点的K8S环境&#xff0c;并初步尝试将ASP.NET Core WebAPI项目部署到了K8S&#xff0c;把玩了一下快速部署和实例伸缩。这个系列开始&#xff0c;会继续学…

2020 区域赛(沈阳) M. United in Stormwind fwt + sosdp

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 有nnn个试卷&#xff0c;每个试卷有mmm个问题&#xff0c;每个问题有两个选项a,ba,ba,b&#xff0c;定义两个试卷不同当且仅当其选中的问题中有一个问题不同。现在问你对于mmm个问题的所有子集&#xff0c;有…

邻值查找—算法进阶指南

邻值查找 给定一个长度为 n 的序列 A&#xff0c;A 中的数各不相同。对于 A 中的每一个数 Ai&#xff0c;求&#xff1a; min1≤j<i|Ai−Aj| 以及令上式取到最小值的 j&#xff08;记为 Pi&#xff09;。若最小值点不唯一&#xff0c;则选择使 Aj 较小的那个。 输入格式 …

我眼中的 NCC,WTM 寻亲之旅

峥嵘岁月如谢花流水&#xff0c;三朝五帝如散雾云海。开发语言更迭如此。我们所坚持的&#xff0c;只是那最初的感动&#xff0c;那“只是在人群中多看了你一眼”的惊艳。三十年河东&#xff0c;三十年河西&#xff0c;不忘初心&#xff0c;方得始终&#xff01;嗯&#xff0c;…

Codeforces Round #594 (Div. 2) C. Ivan the Fool and the Probability Theory 思维 + dp

文章目录题意&#xff1a;思路题意&#xff1a; 思路 一开始找规律&#xff0c;表都打好了&#xff0c;没找出来。。 找规律还是适合让队友来。 先考虑第一行&#xff0c;我们先计算第一行的方案数&#xff0c;设f[i][j]f[i][j]f[i][j]表示到了iii位&#xff0c;第iii位的颜色…

国王游戏

国王游戏 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏。 首先,他让每个大臣在左、右手上面分别写下一个整数,国王自己也在左、右手上各写一个整数。 然后,让这 n 位大臣排成一排,国王站在队伍的最前面。 排好队后,所有的大臣都会获得国王奖赏的若干金币,每位大臣获得的金…

Wtm携手LayUI -- .netcore 开源生态我们是认真的!

经过WTM团队和LayUI团队多次深入协商&#xff0c;双方于2019年7月29日在北京中国国际展览中心正式达成战略合作意向&#xff0c;双方签署了战略合作框架协议&#xff0c;LayUI团队承诺使用WTM框架的任何项目都可以免费使用其收费版的后台模板&#xff0c;WTM团队则从受捐助款项…

Codeforces Round #305 (Div. 1) D. Mike and Fish 欧拉回路

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 欧拉回路经典题。 将其转换成图上问题&#xff0c;对于横纵坐标我们将其分开&#xff0c;对于(x,y)(x,y)(x,y)我们将其横纵坐标连一个无向边&#xff0c;现在问题就转换成了我们需要对每条…

经典二分:秦腾与教学评估

秦腾与教学评估 题面描述 在秦腾进入北京大学学习的第一个学期&#xff0c;就不幸遇到了前所未有的教学评估。在教学评估期间&#xff0c;同学们被要求八点起床&#xff0c;十一点回宿舍睡觉&#xff0c;不准旷课&#xff0c;上课不准迟到&#xff0c;上课不准睡觉……甚至连著…