Я заметил странную разницу между управляемым и собственным кодом .Net. У меня тяжелая работа, перенаправленная в пул потоков. При запуске приложения в управляемом коде все работает гладко, но как только я включаю нативную компиляцию - задача выполняется в несколько раз медленнее и настолько медленно, что зависает поток пользовательского интерфейса (я думаю, процессор настолько перегружен).
Вот два снимка экрана с выходными данными отладки: один слева — из управляемого кода, а справа — из собственной компиляции. Как вы можете видеть, время, затраченное на задачу пользовательского интерфейса, почти одинаково в обоих случаях, вплоть до момента запуска задания пула потоков - затем в управляемой версии истекшее время пользовательского интерфейса увеличивается (фактически пользовательский интерфейс блокируется, и вы не можете предпринять какие-либо действия). Время работы threadpool говорит само за себя.
Пример кода для воспроизведения проблемы:
private int max = 2000;
private async void UIJob_Click(object sender, RoutedEventArgs e)
{
IProgress<int> progress = new Progress<int>((p) => { MyProgressBar.Value = (double)p / max; });
await Task.Run(async () => { await SomeUIJob(progress); });
}
private async Task SomeUIJob(IProgress<int> progress)
{
Stopwatch watch = new Stopwatch();
watch.Start();
for (int i = 0; i < max; i++)
{
if (i % 100 == 0) { Debug.WriteLine($" UI time elapsed => {watch.ElapsedMilliseconds}"); watch.Restart(); }
await Task.Delay(1);
progress.Report(i);
}
}
private async void ThreadpoolJob_Click(object sender, RoutedEventArgs e)
{
Debug.WriteLine("Firing on Threadpool");
await Task.Run(() =>
{
double a = 0.314;
Stopwatch watch = new Stopwatch();
watch.Start();
for (int i = 0; i < 50000000; i++)
{
a = Math.Sqrt(a) + Math.Sqrt(a + 1) + i;
if (i % 10000000 == 0) { Debug.WriteLine($"Threadpool -> a value = {a} got in {watch.ElapsedMilliseconds} ms"); watch.Restart(); };
}
});
Debug.WriteLine("Finished with Threadpool");
}
Если вам нужен полный образец, вы можете загрузить его здесь< /а>.
Как я тестировал, разница проявляется как в оптимизированном, так и в неоптимизированном коде, как в отладочной, так и в релизной версиях.
Кто-нибудь знает, что может вызвать проблему?
ThreadPool.SetMinThreads/SetMaxThreads
? - person noseratio   schedule 08.01.2016