次のコードは、約 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++)
私の質問は、並列実行するとなぜこれがずっと遅いのですか?
私の理論では、スレッドごとに 1 回行われる動的オブジェクトの解析にはオーバーヘッドがあるというものです。単純なループでは、DLR は最初にその処理を実行し、その後の各呼び出しでは必要ありません。
ただし、並行して、各呼び出しで DLR のオーバーヘッドが発生します。
これは正しい仮定ですか、それともベースから外れていますか?