关于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的过程中,问题出现了。我做了如下的测试:
using System;namespace ConsoleApplication2{ class Program { static void Main() { } }}
using System;namespace ConsoleApplication2{ class Program { static void Main() { int[] m = new int[100]; } }}
using System;namespace ConsoleApplication2{ class Program { static void Main() { int[] m = new int[100000]; } }}
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; } }}
class A{ static void Main() { int[] m = new int[3500000]; for (int i = 0; i < m.Length; i++) // <--- 使用 m 的全部 { m[i] = i; } string[] s = System.Console.ReadLine().Split(); System.Console.WriteLine(int.Parse(s[0]) + int.Parse(s[1])); }}
[解决办法]
mark..
[解决办法]
楼主你是在探讨内存分配的问题吗?学习
[解决办法]
通过c#测试工具测试下
[解决办法]
好帖子,学习了要顶,
看高手门解答。
------解决方案--------------------
不错。。。。
[解决办法]
顶
[解决办法]
友情一顶!!
[解决办法]
mark,关注
[解决办法]
高层次编程
[解决办法]
Mark
[解决办法]
感觉挺好玩的,帮顶一下
[解决办法]
哎 好难
[解决办法]
真的很好
[解决办法]
要想清楚什么原因.. 自己写出一门语言来.
[解决办法]
ding
[解决办法]
顶下
[解决办法]
只能顶一个,关注一下!
[解决办法]
回帖是一种美德
[解决办法]
留名!
[解决办法]
真的很难的学习啊
[解决办法]
学习了
一般不用到这样对内存要求太高的……
以前都是汇编或者C写,现在是有界面了才用C#的……
[解决办法]
学习!
[解决办法]
高手啊
[解决办法]
很不错,可以学习学习
[解决办法]
留待测试!
[解决办法]
留名。。
x大根到此一游
[解决办法]
mark and up and study
[解决办法]
0023f200 01c04f20 System.IO.TextReader+SyncTextReader
0023f224 01c0330c System.Int32[]
0023f228 01c0330c System.Int32[]
0023f22c 01c032fc System.Object[] (System.String[])
0023f2e4 01c032fc System.Object[] (System.String[])
0023f498 01c032fc System.Object[] (System.String[])
0023f4c0 01c032fc System.Object[] (System.String[])
而那个数组int[] m = new int[100]中,实际占用的空间是:
0:000> !da 01c0330c
Name: System.Int32[]
MethodTable: 69f3a9fc
EEClass: 69cfb4d4
Size: 412(0x19c) bytes
Array: Rank 1, Number of elements 100, Type Int32
Element Methodtable: 69f3aaac
412个字节而已。
但是占用了412,是否意味着仅仅分配了412个字节呢?
你建立了一个1字节的文本文件,是否意味着文件在磁盘只占用1个字节呢?扇区另外的空间也可以给别的文件使用呢?这是同样的道理,楼主你仔细想想。
再看heap的,看看内存里面都是啥:
0:000> !dumpheap -stat
total 315 objects
Statistics:
MT Count TotalSize Class Name
6a56be7c 1 16 System.IO.TextReader+SyncTextReader
69f3ba58 1 16 System.Text.DecoderReplacementFallback
69f3ba08 1 16 System.Text.EncoderReplacementFallback
69f3d78c 1 20 Microsoft.Win32.SafeHandles.SafeFileHandle
69f3adc4 1 20 System.Security.PermissionToken
69f37a80 1 20 Microsoft.Win32.SafeHandles.SafeFileMappingHandle
69f37a28 1 20 Microsoft.Win32.SafeHandles.SafeViewOfFileHandle
69f3799c 1 20 System.Text.InternalEncoderBestFitFallback
69f3a740 2 24 System.Security.Permissions.SecurityPermission
69f3a484 1 24 System.OperatingSystem
69f379e8 1 24 System.Text.InternalDecoderBestFitFallback
6a569214 1 28 System.Text.DBCSCodePageEncoding+DBCSDecoder
69f38f2c 1 28 System.SharedStatics
69f383bc 1 28 System.IO.Stream+NullStream
69f37c10 1 28 Microsoft.Win32.Win32Native+InputRecord
69f41c70 1 32 System.Text.UnicodeEncoding+Decoder
69f3ae70 1 32 System.Security.PermissionTokenFactory
69f3a240 1 32 Microsoft.Win32.Win32Native+OSVERSIONINFO
69f153a8 1 32 System.Text.UnicodeEncoding
69f3ae24 1 36 System.Security.Util.TokenBasedSet
69f3ac8c 1 36 System.Security.Permissions.FileIOPermission
69f3a03c 1 36 System.Int64[]
69f37c64 1 36 System.IO.__ConsoleStream
69f3a348 1 40 Microsoft.Win32.Win32Native+OSVERSIONINFOEX
69f3a700 1 44 System.Security.FrameSecurityDescriptor
69f3934c 1 44 System.AppDomainSetup
69f3d9f8 4 48 System.UInt16
69f3a7e8 3 48 System.Security.Permissions.FileIOAccess
69f3a408 2 48 System.Version
69f39dac 2 48 System.Reflection.Assembly
69f3ab88 2 56 System.Collections.ArrayList+ArrayListEnumeratorSimple
69f38e34 1 56 System.Threading.Thread
69f2430c 1 60 System.IO.StreamReader+NullStreamReader
69f24220 1 60 System.IO.StreamReader
69f3b688 1 68 System.Globalization.CultureTable
69f3a830 3 72 System.Security.Util.StringExpressionSet
69f3a524 2 72 System.Security.PermissionSet
69f38ba4 1 72 System.ExecutionEngineException
69f38b14 1 72 System.StackOverflowException
69f38a84 1 72 System.OutOfMemoryException
6a5690e8 1 76 System.Text.DBCSCodePageEncoding
69f3847c 8 96 System.Object
69f3b71c 5 100 System.Globalization.CultureTableItem
69f39040 1 100 System.AppDomain
0044e678 7 100 Free
69f3aaac 9 108 System.Int32
69f3899c 6 120 System.Text.StringBuilder
69f3b7c4 1 128 System.Globalization.NumberFormatInfo
69f3b638 3 144 System.Globalization.CultureTableRecord
69f3a890 6 144 System.Collections.ArrayList
69f38c34 2 144 System.Threading.ThreadAbortException
69f399e0 8 160 System.RuntimeType
69f39f58 3 192 System.IO.UnmanagedMemoryStream
69f3b45c 3 204 System.Globalization.CultureInfo
69f3aeb4 7 392 System.Collections.Hashtable
69f3b2d0 4 436 System.Byte[]
69f3afb0 7 1008 System.Collections.Hashtable+bucket[]
69f39490 19 1248 System.Char[]
69f3a9fc 10 2388 System.Int32[]
69f38860 127 6696 System.String
69f14e8c 26 9452 System.Object[]
Total 315 objects
并不是说,你new了一个数组,内存里面只有你自己的东西的。也并不是说,你跑了一个循环,内存就是你想象的方式来做的。
唯一的办法,你要把内存dump出来,这样才能研究清楚。
[解决办法]
大家探讨探讨,有助于理解内存分配问题。
[解决办法]
学习
[解决办法]
UP
[解决办法]
.NET内部的事情,可以用windbg看出一些。
我以前写过的一些post,你可以参考一下:
http://www.cnblogs.com/juqiang/category/118306.html
[解决办法]
需要学习的地方真是太多了~~
[解决办法]
不错
class Program { static void Main(string[] args) { } }
[解决办法]
学习中~~~~ 支持下
[解决办法]
up ..