下面的代碼運行在大致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的開銷發生在每次調用中。
這是一個正確的假設,或我的方式基地?
首先確保使用發佈版本。當我運行你的代碼時,我在調試模式下獲得了類似的時間,但在釋放模式下只有0.07秒。它仍然更高,但要低得多。 (雖然常規for循環會下降很多。) – Servy