【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

恐怖如斯啊~~~

相关推荐
卡尔特斯3 小时前
Android Kotlin 项目代理配置【详细步骤(可选)】
android·java·kotlin
白鲸开源3 小时前
Ubuntu 22 下 DolphinScheduler 3.x 伪集群部署实录
java·ubuntu·开源
ytadpole3 小时前
Java 25 新特性 更简洁、更高效、更现代
java·后端
纪莫3 小时前
A公司一面:类加载的过程是怎么样的? 双亲委派的优点和缺点? 产生fullGC的情况有哪些? spring的动态代理有哪些?区别是什么? 如何排查CPU使用率过高?
java·java面试⑧股
JavaGuide4 小时前
JDK 25(长期支持版) 发布,新特性解读!
java·后端
用户3721574261354 小时前
Java 轻松批量替换 Word 文档文字内容
java
白鲸开源4 小时前
教你数分钟内创建并运行一个 DolphinScheduler Workflow!
java
Java中文社群5 小时前
有点意思!Java8后最有用新特性排行榜!
java·后端·面试
代码匠心5 小时前
从零开始学Flink:数据源
java·大数据·后端·flink
间彧5 小时前
Spring Boot项目中如何自定义线程池
java