簡體   English   中英

如何減少 C# 控制台應用程序項目的內存使用量?

[英]How to reduce the memory usage of a C# console application project?

這是程序消耗 36.50 MB 的內存,但我希望它小於 32 MB

public static void CreateText(string text)
{
    if (Convert.ToInt32(text.Length) <= 80)
    {
        int n;
        string str = "";
        string count = "";
        char[] mas = text.ToCharArray();

        for (int i = 0; i < Convert.ToInt32(mas.Length); i++)
        {
            if (int.TryParse(mas[i].ToString(), out n))
            {
                count += mas[i].ToString();
            }
            else
            {
                if (String.IsNullOrEmpty(count))
                {
                    str += mas[i].ToString();
                }
                else
                {
                    for (int j = 0; j < Convert.ToInt32(count); j++)
                    {
                        str += mas[i].ToString();
                    }
                    count = "";
                }
            }

        }
        Console.WriteLine(str);
    } else {
        Console.WriteLine("Error");
    }
}

為了減少內存占用,您需要讀取通過對字符串應用操作+=生成的臨時字符串對象。 String 在 C# 中是不可變對象,因此+=創建新字符串。 StringBuilder 是可變的,所以用它代替字符串。 您還需要將 count 作為 int,而不是 string 或 StringBuilder。

public static void CreateText(string mas)
{
    if (mas.Length <= 80)
    {
        StringBuilder str;
        int count;
        for (int i = 0; i < mas.Length; i++)
        {
            if (mas[i] >= '0' && mas[i] <= '9')
                count = count * 10 + mas[i] - '0';
            else
            {
                if (count == 0)
                    str.Append(mas[i]);
                else
                {
                    for (int j = 0; j < count; j++)
                          str.Append(mas[i]);
                    count = 0;
                }
            }
        }
        Console.WriteLine(str.ToString());
    }
    else
        Console.WriteLine("Error");
}

這恐怕是不可能的。 36MB 程序中的大部分 RAM 只是核心框架庫。 36MB 不算什么

但我確實看到了一些潛在的改進,其中最大的改進是將count保持為整數而不是字符串,並使用字符串構造函數和 StringBuilder 而不是一直附加到字符串:

public static void CreateText(string text)
{
    if (text != null && text.Length <= 80)
    {
        int n; int count = 0;
        StringBuilder result = new StringBuilder();
        char[] mas = text.ToCharArray();

        foreach(char c in text)
        {
            if (int.TryParse(c.ToString(), out n))
            {
                count = (count * 10) + n;
            }
            else
            {
                if (count == 0) 
                { 
                    result.Append(c);
                }
                else
                {
                    result.Append(new string(c, count));
                    count = 0;
                }
            }

        }
        Console.WriteLine(result.ToString());
    } else {
        Console.WriteLine("Error");
    }
}

如果您希望能夠在輸入字符串中顯式設置 0 重復,則存在一個潛在的錯誤。 如果是這種情況,我們將需要一些效率稍低的東西,但仍然應該比原來的有很大的改進:

public static void CreateText(string text)
{
    if (text != null && text.Length <= 80)
    {
        int n; int count = -1;
        StringBuilder result = new StringBuilder();
        char[] mas = text.ToCharArray();

        foreach(char c in text)
        {
            if (int.TryParse(c.ToString(), out n))
            {
                if (count == -1) count = 0;
                count = (count * 10) + n;
            }
            else
            {
                if (count == -1) 
                { 
                    result.Append(c);
                }
                else
                {
                    result.Append(new string(c, count));
                    count = -1;
                }
            }

        }
        Console.WriteLine(result.ToString());
    } else {
        Console.WriteLine("Error");
    }
}

嘗試這個:

public static void CreateText(string text)
{
    if (text.Length <= 80)
    {
        var str = new StringBuilder();
        var count = new StringBuilder();

        for (int i = 0; i < text.Length; i++)
        {
            int n;
            if (int.TryParse(text[i].ToString(), out n))
            {
                count.Append(text[i]);
            }
            else
            {
                if (String.IsNullOrEmpty(count.ToString()))
                {
                    str.Append(text[i]);
                }
                else
                {
                    for (int j = 0; j < Convert.ToInt32(count.ToString()); j++)
                    {
                        str.Append(text[i].ToString());
                    }
                    count.Clear();
                }
            }
        }
        Console.WriteLine(str);
    }
    else
    {
        Console.WriteLine("Error");
    }
}

我所做的是:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM