首页 > 编程语言 >C# List删除元素的性能优化

C# List删除元素的性能优化

时间:2024-09-12 10:52:51浏览次数:8  
标签:index 删除 C# List 元素 list RemoveAt items size

背景

X上闲逛发现这样一个post
image

简单翻译一下,就是说如果针对无序数组(顺序不重要),要删除其中某个元素,比起费劲的移动很多元素,可以把要删除的元素和最后一个元素交换,然后减小数组的长度即可。

然后我看有回复说,他给dotnet提了PR有这样的一个优化

github PR地址:https://github.com/dotnet/runtime/pull/106581/commits/28f434c3f3415181901a803985d05b19b0d18107

方便观看,我直接截图贴在这里:
image

分析

上图我们可以看到这个优化就是文章开头提到的方法,将list.RemoveAt(targetIndex)优化,
先与最后一个元素交换list[targetIndex] = list[^1]
然后list.RemoveAt(lastIndex)

那么二者到底有何差异?
那就得看RemoveAt的源码了

RemoveAt源码

源码地址:https://github.com/microsoft/referencesource/blob/master/mscorlib/system/collections/generic/list.cs#L877

此处方便查看,我直接贴出来:

        public void RemoveAt(int index) {
            if ((uint)index >= (uint)_size) {
                ThrowHelper.ThrowArgumentOutOfRangeException();
            }
            Contract.EndContractBlock();
            _size--;
            if (index < _size) {
                Array.Copy(_items, index + 1, _items, index, _size - index);
            }
            _items[_size] = default(T);
            _version++;
        }

看源码,流程是这样的
因为是移除某个index元素,list的size必然会少一个,所以首先size--
正常我们指定某个index,那么将会进行Array.Copy操作,我们可以看到这个方法有5个参数,参数意义见:

public static void Copy(Array sourceArray, int sourceIndex, Array destinationArray, int destinationIndex, int length)
{
   
}

我们可以看到sourceArray 和 destinationArray其实都是当前数组_items
Copy之后,最后一个元素必然空着了,所以会把最后一个元素置为泛型目标的默认值 _items[_size] = default(T);

示意如下,现在小学生都能理解
image

代码如此,回到刚才的问题,list.RemoveAt(lastIndex)的时候,由于size--,所以不会进入if代码块,所以也不会发生Array.Copy操作。

标签:index,删除,C#,List,元素,list,RemoveAt,items,size
From: https://www.cnblogs.com/talentzemin/p/18409748

相关文章

  • pbootcms模板指定栏目标签调用
    指定栏目标签适用范围:全站任意地方均可使用标签作用:用于调导航菜单栏目列表,对应后台的“基础内容>内容栏目”1、指定栏目列表{pboot:sortscode=*}<ahref="[sort:link]">[sort:name]</a>{/pboot:sort} 控制参数:scode=* 栏目编码,必填,用于控制输出的栏目,可以同时输......
  • C++复习day11
    类型转化C语言中的类型转换在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转化,C语言中总共有两种形式的类型转换:隐式类型转换和显式类型转换。隐式类型转化:编译器在编译阶段自动进行,能转就转,......
  • 开源低代码平台,JeecgBoot v3.7.1 大版本发布
    项目介绍JeecgBoot是一款企业级的低代码平台!前后端分离架构SpringBoot2.x,SpringCloud,AntDesign&Vue3,Mybatis-plus,Shiro,JWT支持微服务。强大的代码生成器让前后端代码一键生成!JeecgBoot引领低代码开发模式(OnlineCoding->代码生成->手工MERGE),帮助解决Java项目70%的重复......
  • 最新PyCharm下载安装教程保姆级教程(详细步骤)附激活码!!
    一、软件简介PyCharm是一种Python IDE(IntegratedDevelopmentEnvironment,集成开发环境),带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试、语法高亮、项目管理、代码跳转、智能提示、自动完成、单元测试、版本控制。此外,该IDE提供了一些高级功能,以用于......
  • 强烈推荐PyCharm中常用的插件,增强效率,赶快收藏起来!!!
    一、pycharm插件安装方法和路径在上篇文章中介绍到的汉化pycharm的方法中就是通过汉化插件完成的,具体操作如下:打开设置 > 插件,在右侧的文本框中输入想要查看的插件名称,在下方就会罗列出已经安装的相关的插件。二、好用的几个插件1、汉化插件ChineseLanguagePack直......
  • Open CLIP
    CLIP[纸] [引用] [剪辑合作实验室] [可口可乐] 欢迎来到OpenAI的开源实现夹子(对比语言-图像预训练)。利用此代码库,我们在各种数据源和计算预算上训练了多个模型,包括小规模实验更大规模的运行,包括在以下数据集上训练的模型LAION-400M,拉伊奥-2B和数据压缩-1B.本文详细......
  • convnext_xxlarge.clip_laion2b_soup_ft_in12k timm模型库
    Modelcardforconvnext_xxlarge.clip_laion2b_soup_ft_in12kAConvNeXtimageclassificationmodel.CLIPimagetowerweightspretrainedin OpenCLIP onLAIONandfine-tunedonImageNet-12kbyRossWightman.PleaseseerelatedOpenCLIPmodelcardsformored......
  • Docker 可视化工具
    1.PortainerPortainer是一个可视化的容器镜像的图形管理工具,利用Portainer可以轻松构建,管理和维护Docker环境。而且完全免费,基于容器化的安装方式,方便高效部署。官方站点:https://www.portainer.io/ 2.DockerUI DockerUI是一款开源的、强大的、轻量级的Docker管理工具......
  • SciTech-Mathmatics-Analysis-Calculus: Difference+Derivative+Integral+Limit:极限(
    SciTech-Mathmatics-AnalysisCalculus:微积分Difference微分Derivative导数Integral积分Limit:极限(变化的测度与量化,高阶)Series数列/无穷级数Field:数域(Closure),RationalNumber,稠密性:任何两个不同RationalNumbers之间,有无穷无尽的RationalNumbe......
  • PbootCMS在阿里云主机上邮件发送失败:服务器已经禁用stream_socket_client和fsockopen
    当你遇到网站的留言邮件通知功能失效,并且在测试发送邮件时收到“服务器已经禁用stream_socket_client和fsockopen函数,请至少开启一个才能发送邮件!”这样的错误提示时,这通常意味着服务器出于安全考虑禁用了这两个PHP函数。这两个函数是用来建立网络连接的,对于发送邮件等功能至关重......