以下代码在大约 2.5 秒内运行:
static void Main(string[] args)
{
var service = new Service();
Parallel.For(0, 100, i => {
dynamic user = new ExpandoObject();
user.data = new ExpandoObject();
user.data.id = i;
user.data.name = "User Name";
var parsed = service.Parse(user);
});
}
public class Service
{
public User Parse(dynamic dynamicUser)
{
if (dynamicUser.data != null)
{
return new User
{
Id = dynamicUser.data.id,
Name = dynamicUser.data.name
};
}
return null;
}
}
public class User
{
public int Id { get; set; }
public string Name { get; set; }
}
但是,如果我将 Parallel.For() 循环更改为简单的 For 循环,它将在大约 200 毫秒内运行:
for (var i = 0; i < 100; i++)
所以我的问题是,为什么并行运行会慢得多?
我的理论是,在解析每个线程执行一次的动态对象时会有一些开销。在简单循环中,DLR 第一次做它的事情,然后不需要为每个后续调用做。
但同时,DLR 的开销发生在每次调用中。
这是一个正确的假设,还是我离谱?