匿名函数在循环中占用更多内存
do anonymous-function take more memory in loop
我在想。下面的代码片段是否比第二个
消耗更多的内存
List<Action> myList = new List<Action>();
for(int i = 0; i < 10000; i++)
{
myList.Add(() => { /* Code */});
}
这次我点一个方法
List<Action> myList = new List<Action>();
for (int i = 0; i < 10000; i++)
{
myList.Add(myFuntion);
}
void myFuntion()...
我想知道第一个代码片段是否使用了更多内存,因为它必须存储匿名方法。还是每次都指向同一个匿名函数
第二个代码片段是指向函数还是每次都存储整个函数
谢谢
我不能肯定地告诉 .NET,但一般来说,这取决于匿名函数是否从投降函数(例如 myList
在您的示例中)捕获任何元素。如果不是,编译器可以将其更改为具有编译器生成的名称的普通静态函数。
如果它捕获了一些东西,那么编译器必须生成并分配一个额外的数据结构来存储捕获的变量并将其用作编译器生成函数的参数。例如。如果你这样做 myList.Add(() => { var z = myList.Count; .... });
编译器需要为它生成这样的东西:
class GenertedEnv
{
public List<Action> myList;
}
static void AnonymousFunction(GeneratedEnv env, /* Plus other lambda parameters*/)
{
var z = env.myList.Count;
...
}
第一个方法将创建一个带有方法的内部 class,并将该方法分配给您要添加到列表中的 Action
委托。
但是,它似乎每次只会实例化一个 Action 并将其添加到列表中。
资料来源:tryroslyn
第二种方法等同于
list.Add(new Action(MyFunction));
所以它会在每个循环中实例化一个新的 Action。
你可以测试一下,第一种方法只会实例化一个Action:
dotnetfiddle
有时发现幕后发生的事情可能会非常令人惊讶。
我在想。下面的代码片段是否比第二个
消耗更多的内存List<Action> myList = new List<Action>();
for(int i = 0; i < 10000; i++)
{
myList.Add(() => { /* Code */});
}
这次我点一个方法
List<Action> myList = new List<Action>();
for (int i = 0; i < 10000; i++)
{
myList.Add(myFuntion);
}
void myFuntion()...
我想知道第一个代码片段是否使用了更多内存,因为它必须存储匿名方法。还是每次都指向同一个匿名函数
第二个代码片段是指向函数还是每次都存储整个函数
谢谢
我不能肯定地告诉 .NET,但一般来说,这取决于匿名函数是否从投降函数(例如 myList
在您的示例中)捕获任何元素。如果不是,编译器可以将其更改为具有编译器生成的名称的普通静态函数。
如果它捕获了一些东西,那么编译器必须生成并分配一个额外的数据结构来存储捕获的变量并将其用作编译器生成函数的参数。例如。如果你这样做 myList.Add(() => { var z = myList.Count; .... });
编译器需要为它生成这样的东西:
class GenertedEnv
{
public List<Action> myList;
}
static void AnonymousFunction(GeneratedEnv env, /* Plus other lambda parameters*/)
{
var z = env.myList.Count;
...
}
第一个方法将创建一个带有方法的内部 class,并将该方法分配给您要添加到列表中的 Action
委托。
但是,它似乎每次只会实例化一个 Action 并将其添加到列表中。
资料来源:tryroslyn
第二种方法等同于
list.Add(new Action(MyFunction));
所以它会在每个循环中实例化一个新的 Action。
你可以测试一下,第一种方法只会实例化一个Action:
dotnetfiddle
有时发现幕后发生的事情可能会非常令人惊讶。