When is it acceptable to call GC.Collect?

前端 未结 24 2563
挽巷
挽巷 2020-11-22 08:54

The general advise is that you should not call GC.Collect from your code, but what are the exceptions to this rule?

I can only think of a few very speci

24条回答
  •  南旧
    南旧 (楼主)
    2020-11-22 09:07

    I was doing some performance testing on array and list:

    private static int count = 100000000;
    private static List GetSomeNumbers_List_int()
    {
        var lstNumbers = new List();
        for(var i = 1; i <= count; i++)
        {
            lstNumbers.Add(i);
        }
        return lstNumbers;
    }
    private static int[] GetSomeNumbers_Array()
    {
        var lstNumbers = new int[count];
        for (var i = 1; i <= count; i++)
        {
            lstNumbers[i-1] = i + 1;
        }
        return lstNumbers;
    }
    private static int[] GetSomeNumbers_Enumerable_Range()
    {
        return  Enumerable.Range(1, count).ToArray();
    }
    
    static void performance_100_Million()
    {
        var sw = new Stopwatch();
    
        sw.Start();
        var numbers1 = GetSomeNumbers_List_int();
        sw.Stop();
        //numbers1 = null;
        //GC.Collect();
        Console.WriteLine(String.Format("\"List\" took {0} milliseconds", sw.ElapsedMilliseconds));
    
        sw.Reset();
        sw.Start();
        var numbers2 = GetSomeNumbers_Array();
        sw.Stop();
        //numbers2 = null;
        //GC.Collect();
        Console.WriteLine(String.Format("\"int[]\" took {0} milliseconds", sw.ElapsedMilliseconds));
    
        sw.Reset();
        sw.Start();
    //getting System.OutOfMemoryException in GetSomeNumbers_Enumerable_Range method
        var numbers3 = GetSomeNumbers_Enumerable_Range();
        sw.Stop();
        //numbers3 = null;
        //GC.Collect();
    
        Console.WriteLine(String.Format("\"int[]\" Enumerable.Range took {0} milliseconds", sw.ElapsedMilliseconds));
    }
    

    and I got OutOfMemoryException in GetSomeNumbers_Enumerable_Range method the only workaround is to deallocate the memory by:

    numbers = null;
    GC.Collect();
    

提交回复
热议问题