日期:2014-05-20  浏览次数:20929 次

关于C#内存占用的问题!从几道ACM题中发现的一个问题!
问题是从http://acm.timus.ru 上的几道题开始的(1220,1275,1306)

http://acm.timus.ru/problem.aspx?space=1&num=1220
http://acm.timus.ru/problem.aspx?space=1&num=1306

这3道题都是不推荐用Java或C#来解的,主要是内存限制的比较严,用c或pascal解,都存在内存使用超标的可能。
需要严谨的计算内存使用,并设计更为精巧的数据结构,才能通过这3道题的test。

可偏有不信邪的高手,于是一个名为Fyodor Menshikov的人出现,他用Java过了1220和1306。(这个人确实有点牛)

于是有几个象我这样常用C#的看到了希望,开始在这几道题上前仆后继,几天前1306的第一个c#方案出现了,是空军同志解的。
自己写了一个c#版的优先队列,确实很不错!受了他的鼓舞,我也用c#过了1306,方法也是大同小异。

在这3道题中,1306应当算是最容易的,给的空间较大,1220就要难不少,而1275比1220又要难上很多,连那个Fyodor Menshikov,
也没能用Java过。

在1306被搞定之后,大家又开始攻克1220,在AC1220的过程中,问题出现了。我做了如下的测试:

C# code

using System;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main()
        {
        }
    }
}



一个这样的程序,占用内存为365K,而一个这样的程序占用内存竟然骤增到405K

C# code

using System;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main()
        {
            int[] m = new int[100];
        }
    }
}



这样的程序竟然只占409k

C# code

using System;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main()
        {
            int[] m = new int[100000];
        }
    }
}



可是现在却变成了853K

C# code

using System;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main()
        {
            int[] m = new int[100];
            for (int i = 0; i < m.Length; i++)
                m[i] = (short)i;
        }
    }
}



按理说100000个整形应当占400K,409+400=809,不应该是853呀!有谁知道是什么原因么?
C#的内存分配管理究竟有什么细节是我们不清楚的,而出现了这样的情况?

btw:现在http://acm.timus.ru/几乎快成了大家搞性能测试的地方了

------解决方案--------------------
帮楼主顶。
------解决方案--------------------
Mark
------解决方案--------------------
友情一顶
再顶
顶不过三。
------解决方案--------------------
期待大牛的出现.
------解决方案--------------------
友情帮顶
------解决方案--------------------
1220用C#实在是太困难了,我最接近的一次是850多K,每次都是在Text#1的时候MLE
------解决方案--------------------
加精之,希望有人能解楼主之惑
------解决方案--------------------
探讨
呵呵,我也是从1220开始的,跑到了test10 MLE了,空军同志跑到了test11,很不容易了。
我第一次跑到test10的时候,以为离目标不远了,可后来用c++解了一遍才知道,其实还远着呢。
test10\test12\test16 都是难点,我用c++写了一个529K AC的(换成纯C的应该可以低于500K),
但换算成C#,恐怕要850K以上了,距离目标还是有很远的距离的。

引用:
1220用C#实在是太困难了,我最接近的一次是850多K,每次都…

------解决方案--------------------
顶!
------解决方案--------------------
顶起楼上的...
------解决方案--------------------
留名关注,抱歉楼主,改日我会学C#
------解决方案--------------------
顶,顶。
------解决方案--------------------