【C#】关于Array.Copy 和 GC

关于Array.Copy 和 GC

csharp 复制代码
	//一个简单的 数组copy   什么情况下会触发GC呢
    [ReliabilityContract(Consistency.MayCorruptInstance, Cer.MayFail)]
    public static void Copy(Array sourceArray,
                            long sourceIndex,
                            Array destinationArray,
                            long destinationIndex,
                            long length);

当源和目标的类型不一致,由小转大,比如由byte 到 short ,int 都会触发GC ,我不知道内部机制如何,可能是拆装箱导致的 ,不确定,不过在实际开发中确实出现了这种问题,所以使用的时候 类型要匹配

贴一段测试代码

csharp 复制代码
   void Update()
    {
        var start = DateTime.Now;
        for (int i = 0; i < this.inputData.Length; i++)
        {
            this.inputData[i] = -125;
            var a = Mathf.Abs(this.inputData[i]);
            a = Mathf.Clamp(a, 0, 1023);
            this.inputData[i] = (short)(a * 255 / 1023);
        }
        Debug.Log($"<color=#ff00ff>CPU cost : {(DateTime.Now - start).TotalMilliseconds}</color>");

        start = DateTime.Now;
        **byte[] outData = new byte[size];**
        this.ComputeData(ref outData); //GPU

        int[] outData2 = new int[this.size];
        Array.Copy(outData, 0, outData2, 0, outData.Length);
        
        Debug.Log($"<color=#ffff00>GPU cost : {(DateTime.Now - start).TotalMilliseconds}</color>");
    }

    private void ComputeData(ref int[] outPutBytes)
    {
        //if (this.inputbuffer == null)
        {
            inputbuffer = new ComputeBuffer(this.inputData.Length, 4); //定义缓冲区(参数:数组长度、每个数组元素占用字节数)
        }

        //if (this.outputbuffer == null)
        {
            outputbuffer = new ComputeBuffer(this.outputData.Length, 4);
        }

        inputbuffer.SetData(this.inputData); //待计算数据加载入缓冲区
        this.shader.SetBuffer(this.k, "inputData", inputbuffer); //定义输入口
        this.shader.SetBuffer(this.k, "outputData", outputbuffer); //定义输出口

        this.shader.Dispatch(this.k, this.inputData.Length / 1024, 1, 1); //开始执行(参数:主函数下标、线程组的XYZ个数)
        outputbuffer.GetData(this.outputData); //缓冲区获得计算好的数据

        for (int i = 0; i < this.outputData.Length; i++)
        {
            outPutBytes[i] = (byte)this.outputData[i];
        }

        inputbuffer.Dispose(); //清除缓存
        outputbuffer.Dispose();
    }

运行情况

GC

恐怖如斯啊~~~

相关推荐
洛寒瑜5 分钟前
【读书笔记-《30天自制操作系统》-23】Day24
开发语言·汇编·笔记·操作系统·应用程序
ephemerals__6 分钟前
【c++】动态内存管理
开发语言·c++
咩咩觉主8 分钟前
en造数据结构与算法C# 群组行为优化 和 头鸟控制
开发语言·c#
是梦终空13 分钟前
JAVA毕业设计176—基于Java+Springboot+vue3的交通旅游订票管理系统(源代码+数据库)
java·spring boot·vue·毕业设计·课程设计·源代码·交通订票
CVer儿15 分钟前
条件编译代码记录
开发语言·c++
凌不了云20 分钟前
windows环境下安装python第三方包
开发语言·python
落落落sss22 分钟前
sharding-jdbc分库分表
android·java·开发语言·数据库·servlet·oracle
码爸26 分钟前
flink doris批量sink
java·前端·flink
鸽芷咕26 分钟前
【Python报错已解决】python setup.py bdist_wheel did not run successfully.
开发语言·python·机器学习·bug
星迹日40 分钟前
C语言:联合和枚举
c语言·开发语言·经验分享·笔记