首页 > 编程知识 正文

C#内存分配性能测试

时间:2023-05-03 12:04:40 阅读:183304 作者:3764

一、在64位应用下对C#的对象和结构内存分配做了性能测试,测试结果如下

二、结论
1、GC.GetTotalMemory获得的并非物理内存,而是Runtime自己统计的内存。
2、新建数组时,没有立即分配物理内存,而是分配了虚拟内存。
3、64位下对象默认占用16字节(对象指针和同步块索引),结构体没有类似的内容,如果不得不减少内存占用,可以考虑用结构体。
4、大量小对象的分配比较耗时,每1M*32耗费74ms。
5、总大小1.6G的结构体数组分配耗时很小,大概200ms。

三、源码

public class ClassMemory{ public int a; public float b; public double c;}public struct StructMemory{ public int a; public float b; public double c;}public class MemoryTest{ public void DoTest() { Stopwatch s = new Stopwatch(); s.Start(); int minMemoryLen = 100000000; long t1 = s.ElapsedMilliseconds; long m1 = GC.GetTotalMemory(false); ClassMemory[] minClassArr = new ClassMemory[minMemoryLen]; long m2 = GC.GetTotalMemory(false); long t2 = s.ElapsedMilliseconds; for (int i=0;i< minMemoryLen; i++) { minClassArr[i] = new ClassMemory(); } long m3 = GC.GetTotalMemory(false); long t3 = s.ElapsedMilliseconds; long m4 = GC.GetTotalMemory(false); long t4 = s.ElapsedMilliseconds; StructMemory[] minStructArr = new StructMemory[minMemoryLen]; long m5 = GC.GetTotalMemory(false); long t5 = s.ElapsedMilliseconds; for (int i = 0; i < minMemoryLen; i++) { minStructArr[i] = new StructMemory(); } long m6 = GC.GetTotalMemory(false); long t6 = s.ElapsedMilliseconds; for (int i = 0; i < minMemoryLen; i++) { minStructArr[i] = new StructMemory(); } long m7 = GC.GetTotalMemory(false); long t7 = s.ElapsedMilliseconds; Console.WriteLine((t2 - t1) + " " + (t3-t2)); Console.WriteLine((m2 - m1) + " " + (m3 - m2)); Console.WriteLine((t5 - t4) + " " + (t6 - t5) + " " + (t7 - t6)); Console.WriteLine((m5 - m4) + " " + (m6 - m5) + " " + (m7 - m6)); }}

四、输出结果

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。