.NET C#基础教程第28天: Stackalloc

作者:微信公众号:【架构师老卢】
6-10 10:41
32

概述:介绍.Net 应用程序依靠垃圾回收器进行内存分配和解除分配,这简化了内存管理,但如果管理不当,会导致性能下降。本文演示了如何使用 stackalloc 来增强应用程序性能。学习目标了解什么是stackalloc传统堆分配的问题stackalloc 的最佳利用开发人员的先决条件基本了解 C# 编程语言。熟悉for循环开始了解什么是stackallocStackalloc 是 C# 中的一个保留关键字,它有助于在堆栈上分配内存,而不是由 Garbage Collector 管理的堆,而堆栈分配会在方法执行结束后自动释放。传统堆分配的问题请考虑下面的代码示例,其中 的内存在堆上分配。double a

介绍

.Net 应用程序依靠垃圾回收器进行内存分配和解除分配,这简化了内存管理,但如果管理不当,会导致性能下降。本文演示了如何使用 stackalloc 来增强应用程序性能。

学习目标

  • 了解什么是stackalloc
  • 传统堆分配的问题
  • stackalloc 的最佳利用

开发人员的先决条件

  • 基本了解 C# 编程语言。
  • 熟悉for循环

开始

了解什么是stackalloc

Stackalloc 是 C# 中的一个保留关键字,它有助于在堆栈上分配内存,而不是由 Garbage Collector 管理的堆,而堆栈分配会在方法执行结束后自动释放。

传统堆分配的问题

请考虑下面的代码示例,其中 的内存在堆上分配。double array

private double CalculateSum(double[] values)
{
    double sum = 0;
    for (int i = 0; i < values.Length; i++)
    {
        sum += values[i];
    }
    return sum;
}

如果频繁调用上述方法,则会为垃圾回收创建开销,从而降低应用程序性能。

stackalloc 的最佳利用

请在下面找到上一个代码片段的重构版本

private unsafe double CalculateSum(int count)
{
    double sum = 0;
    double* values = stackalloc double[count];  // Allocate memory on the stack
    for (int i = 0; i < count; i++)
    {
        values[i] = SomeValue(i);  // Assume SomeValue is a method returning a double
        sum += values[i];
    }
    return sum;
}

在上面的方法中,值是在堆栈而不是堆上分配的。在这种方法中,不需要垃圾回收,从而加快了执行速度,并可以减轻GC的压力。

对于性能敏感型应用程序,内存管理至关重要,因此使用 stackalloc 开发人员可以有效地执行内存分配/解除分配。

完整代码

创建另一个名为的类,并添加以下代码片段StackAlloc

public static class StackAlloc
{
    static int count = 10000;  // Number of elements
    static double[] values = new double[count];
    public static void BadWay() {

        FillValues(values);
        // Calculate sum using heap allocation

        double heapSum = CalculateSumHeap(values);
        Console.WriteLine($"Heap allocation sum: {heapSum}");

    }
    public static void GoodWay()
    {

        FillValues(values);

        // Calculate sum using stackalloc
        double stackSum = CalculateSumStackalloc(count);
        Console.WriteLine($"Stackalloc sum: {stackSum}");
    }
    private static void FillValues(double[] values)
    {
        for (int i = 0; i < values.Length; i++)
        {
            values[i] = SomeValue(i);
        }
    }

    private static double SomeValue(int i)
    {
        // Just a sample value function
        return i * 2.5;
    }

    private static double CalculateSumHeap(double[] values)
    {
        double sum = 0;
        for (int i = 0; i < values.Length; i++)
        {
            sum += values[i];
        }
        return sum;
    }

    private static unsafe double CalculateSumStackalloc(int count)
    {
        double sum = 0;
        double* values = stackalloc double[count];
        for (int i = 0; i < count; i++)
        {
            values[i] = SomeValue(i);
            sum += values[i];
        }
        return sum;
    }
}

从 main 方法执行,如下所示

#region Day 28: Use Stackalloc  
static string ExecuteDay28()  
{  
    StackAlloc.BadWay();  
    StackAlloc.GoodWay();  
      
    return "Executed Day 28 successfully..!!";  
}  
  
#endregion

控制台输出

Heap allocation sum: 124987500  
Stackalloc sum: 124987500

源代码获取:公众号回复消息【code:30036

相关代码下载地址
重要提示!:取消关注公众号后将无法再启用回复功能,不支持解封!
第一步:微信扫码关键公众号“架构师老卢”
第二步:在公众号聊天框发送code:30036,如:code:30036 获取下载地址
第三步:恭喜你,快去下载你想要的资源吧
阅读排行