从内存消耗的角度来看,这两个代码块之间有什么区别

时间:2015-08-05 13:16:27

标签: c# memory-management

我正在创建一些我作为参数发送的对象。有人告诉我,最好使用第二块代码,因为它不会占用像我的代码块那么多的内存。 他们之间有什么区别?

object[] methodParameters = new object[] {
    new Dictionary<string, string>() { { "port", parameters["port"] }, { "message", Settings.RELAY_1_2_OFF_OFF } },
    null,
    null
};
//...some code...
methodParameters = new object[] {
    new Dictionary<string, string>() { { "port", parameters["port"] }, { "message", Settings.RELAY_3_4_OFF_OFF } },
    null,
    null
};

这一个。

object[] methodParameters = new object[3];
methodParameters[0] = new Dictionary<string, string>() { { "port", parameters["port"] }, { "message", Settings.RELAY_1_2_OFF_OFF } };
methodParameters[1] = null;
methodParameters[2] = null;
//...some code..
methodParameters[0] = new Dictionary<string, string>() { { "port", parameters["port"] }, { "message", Settings.RELAY_3_4_OFF_OFF } };
methodParameters[1] = null;
methodParameters[2] = null;

2 个答案:

答案 0 :(得分:1)

在第一个代码块中,第一个实例化将占用内存中的一个位置。第二个实例化将占用内存中的不同位置,最终垃圾收集器将清理第一个实例化。

在第二个代码块中,只有一个数组的实例化,并且数组的元素被覆盖。

在这两个块中,为索引0实例化的Dictionary将占用内存中的一个位置,然后当&#34; new&#34;字典被实例化它将占用内存中的不同位置,最终垃圾收集器将清理字典的第一个实例。

我会说第一个代码块将暂时&#34;在垃圾收集器开火之前占用更多内存。

答案 1 :(得分:0)

想象一下,第二个代码块可以轻松编写为:

methodParameters

它看起来与原版非常相似,但它包含一个令人讨厌的潜伏错误 - 我们最终得到//...some code..有效地包含与Dictionary之前相同的数据。因此,为了单个数组分配,我们已经交换了清晰,可读的代码,完全忽略了我们仍然具有相同数量的posBg(); $(window).resize(function() { posBg(); }) function posBg(){ var posLeft=$('#about-stat').offset().left; var posTop=$('#about-stat').offset().top; $('#about-stat').css("background-position", posLeft+"px "+posTop+"px"); } 分配,并且这些字典也可以具有任意数量的内部分配。 / p>

正如我所说,编写 clear ,可理解的代码,然后 profile 代码,找出的好处到哪里考虑减少内存使用量 - 并确保以不容易引入错误机会的方式执行此操作。

我几乎保证不会在这里找到它。