首页 > 其他分享 >Memory<T> 和 Span<T>

Memory<T> 和 Span<T>

时间:2024-09-08 21:24:24浏览次数:5  
标签:异步 Span chunkSize chunk 内存 Memory

Memory 和 Span 是 C# 中的高效内存管理工具,特别适用于处理大数据集或需要避免不必要的内存分配的场景。它们提供了高性能、低分配的方式来操作内存。相比传统的数组和集合,它们有以下几个关键好处:

零拷贝:Span 和 Memory 允许对现有内存块进行切片操作,而不会产生新的数组或复制数据,减少了内存分配和垃圾回收的开销。

堆栈分配:Span 可以在堆栈上分配,而不是堆上分配,这意味着它们更轻量且性能更好。

高效内存切片:你可以轻松地从现有的内存块中创建子视图,便于操作和管理数据。

示例:Memory 和 Span 的实际应用
假设我们有一个方法,它需要处理一个包含多个数据块的文件,而每个数据块需要单独进行处理。通常我们可能会用数组来操作,但每次都需要创建新的数组或切片,可能会导致性能下降。

使用传统数组:

void ProcessData(byte[] data, int chunkSize) {
    for (int i = 0; i < data.Length; i += chunkSize) {
        byte[] chunk = new byte[chunkSize];
        Array.Copy(data, i, chunk, 0, chunkSize);  // 拷贝数据
        ProcessChunk(chunk);
    }
}

void ProcessChunk(byte[] chunk) {
    // 对 chunk 进行处理
} 

这种方法在每次处理数据块时都会创建新的数组并拷贝数据,这在处理大数据集时效率低下
在这个版本中,Slice 方法仅创建现有数据的视图,不进行数据复制,显著提高了性能。

使用 Memory 进行异步操作:
在处理异步操作时,Memory 比 Span 更合适,因为 Span 是堆栈分配的,不能在异步方法中使用。

async Task ProcessDataAsync(Memory<byte> data, int chunkSize) {
    for (int i = 0; i < data.Length; i += chunkSize) {
        Memory<byte> chunk = data.Slice(i, chunkSize);  // 切片,无拷贝
        await ProcessChunkAsync(chunk);
    }
}

async Task ProcessChunkAsync(Memory<byte> chunk) {
    // 对 chunk 进行异步处理
}

在这里,Memory 可以跨越异步边界使用,适用于异步场景,而不会发生内存复制。

总结:

Span:适合同步操作,提供高效的内存切片操作。
Memory:适合异步操作,提供同样的高效切片功能,但可以在异步方法中使用。
通过 Memory 和 Span,我们可以避免不必要的内存分配和数据复制,提升程序的性能和内存利用率

标签:异步,Span,chunkSize,chunk,内存,Memory
From: https://www.cnblogs.com/JosenEarth/p/18403517

相关文章

  • QT5 掌握debug调试的方法(简要内容:Memory查看内存地址的数值 和 查看变量值)(图文并茂)
    A1——选择构建模式(选项:debug调试、release发行、profile不知道…)A2——开始运行A3——开始调试(仅在debug调试模式下,断点调试助手才有效)A4——执行构建(生成输出目录及相应的文件,路径要求与工程的路径同级)A1——鼠标悬停变量名弹出,可固定窗口,Qt查看变量值的......
  • 内存管理-14-内核文档翻译-2-memory-allocation.rst 和 gfp_mask-from-fs-io.rst
    一、memory-allocation.rstmsm-5.4/Documentation/core-api/memory-allocation.rst翻译:========================内存分配指南==========================Linux提供了各种用于内存分配的API。您可以使用`kmalloc()`或`kmem_cache_alloc()`系列分配小块,使用`vmalloc()`......
  • LSTM(Long Short-Term Memory,长短期记忆网络)介绍
    关注我,持续分享逻辑思维&管理思维&面试题;可提供大厂面试辅导、及定制化求职/在职/管理/架构辅导;推荐专栏《10天学会使用asp.net编程AI大模型》,目前已完成所有内容。一顿烧烤不到的费用,让人能紧跟时代的浪潮。从普通网站,到公众号、小程序,再到AI大模型网站。干货满满。学成后可......
  • GaLore Memory-Efficient LLM Training by Gradient Low-Rank Projection
    目录概符号说明GaLoreZhaoJ.,ZhangZ.,ChenB.,WangZ.,AnandkumarA.andTianY.GaLore:Memory-efficientllmtrainingbygradientlow-rankprojection.ICML,2024.概本文提出了一种优化器中高效的缓存策略.符号说明\(W_t\in\mathbb{R}^{m\timesn}\),参......
  • [QT]QSharedMemory读写cv::Mat
    1.写入共享内存voidWriteMat(constchar*section,constcv::Mat&img){QSharedMemory*mem=newQSharedMemory();mem->setKey(section);intsize=img.cols*img.rows*img.channels();//cols+rows+channels+data//ifexistreturn......
  • BAdam A Memory Efficient Full Parameter Optimization Method for Large Language M
    目录概BAdam代码LuoQ.,YuH.andLiX.BAdam:Amemoryefficientfullparameteroptimizationmethodforlargelanguagemodels.arXivpreprint,2024.概本文介绍了一种Blockcorrdinatedescent(BCD)的训练方式.BAdam当模型本身很大的时候,训练它会成为一......
  • 使用 SpanMetrics Connector 将 OpenTelemetry 跟踪转换为指标
    原文:https://last9.io/blog/convert-opentelemetry-traces-to-metrics-using-spanconnector/如果您已经实施了跟踪但缺乏强大的指标功能怎么办?SpanConnector是一个通过将跟踪数据转换为可操作指标来弥补这一差距的工具。这篇文章详细介绍了SpanConnector的工作原理,提供了有......
  • 两种形式的dma 实现memory copy代码
    在飞思卡尔的时候,需要用SDMA实现内存到内存memorycopy的功能,需要做两部分的工作:1:在DMAcontroller中加入M2M的支持。2:写一个驱动来调用DMAcontroller的M2M功能。上面的2实际上对于不同的SoC来讲,思路是一样的,有通用性,在这里总结下。当时在实现的时候,用了两种方法:1:cyclic,用dma_a......
  • A 3nm, 32.5TOPS/W, 55.0TOPS/mm2 and 3.78Mb/mm2 Fully-Digital Compute-in-Memory M
    1、强调存储密度(StorageDensity)Mb/mm2,存算一体的主要目的是减少数据搬运的开销,如果一味的堆计算单元而损失存储密度,那么虽然整体的计算吞吐率(TOPS)可以做到很大,相应的对计算密度也会有提升,但是由于需要频繁给CIMMacro刷新数据,从系统能效的角度上来说反而是下降的。这次的SRAMArr......
  • A 12nm 121-TOPS/W 41.6-TOPS/mm2 All Digital Full Precision SRAM-based Compute-in
    1b*4b的操作是通过4b或非门乘法器完成,然后再通过4b加法器两两相加。但是从真值表上来看,2个4b或非门乘法器加1个4b加法器完成的工作实际上可以通过一个由加法器和两比特IN控制的四选一Mux(或者说LUT)来完成。这样做的话可以直接节省掉21%的功耗。提出的这个并行多位输入结构下(即并......