Очень низкая производительность асинхронной задачи, выполняемой в пуле потоков в .Net native

Я наблюдал странную разницу в управляемом и нативном коде .Net. Я тяжёлую работу перенаправил в пул потоков. При запуске приложения в управляемом коде все работает гладко, но как только я включаю собственную компиляцию - задача запускается в несколько раз медленнее и медленнее, что приводит к зависанию потока пользовательского интерфейса (я думаю, что процессор перегружен).

Вот два скриншота из отладочной информации, слева - из управляемого кода, а справа - из собственной компиляции. Как вы можете видеть, время, затрачиваемое задачей пользовательского интерфейса, в обоих случаях практически одинаковое, вплоть до времени, когда запускается задание пула потоков, а затем в управляемой версии истекает время пользовательского интерфейса (фактически пользовательский интерфейс блокируется, и вы не можете предпринимать никаких действий). Сроки работы потокового пула говорят сами за себя.

Пример кода для воспроизведения проблемы:

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");
}

Если вам нужен полный образец - тогда вы можетескачать здесь.

Как я уже тестировал, разница появляется как в оптимизированном / неоптимизированном коде, так и в отладочной и выпускной версиях.

У кого-нибудь есть идея, что может вызвать проблему?

Ответы на вопрос(1)

Ваш ответ на вопрос