Ho notato una strana differenza nel codice nativo gestito vs .Net. Ho un lavoro pesante reindirizzato a threadpool. Quando si esegue l'app nel codice gestito, tutto funziona senza problemi, ma non appena accendo la compilazione nativa - l'attività viene eseguita alcune volte più lentamente e così lentamente da bloccare il thread dell'interfaccia utente (suppongo che la CPU sia così sovraccaricata).Prestazioni molto scarse dell'attività asincrona eseguita su threadpool in. Netto nativo
Ecco due schermate dall'output di debug, quella a sinistra proviene dal codice gestito e quella a destra proviene dalla compilazione nativa. Come puoi vedere, il tempo impiegato dall'interfaccia utente è quasi lo stesso in entrambi i casi, fino al momento in cui viene avviato il processo threadpool, quindi nell'UI della versione gestita il tempo trascorso aumenta (infatti l'interfaccia utente viene bloccata e non è possibile eseguire alcuna azione). I tempi del lavoro Threadpool parlano da soli.
Il codice di esempio per riprodurre il problema:
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");
}
Se avete bisogno di un campione completo - allora si può download it here.
Come ho provato, la differenza appare sia sul codice ottimizzato/non ottimizzato, sia nella versione di debug e di rilascio.
Qualcuno ha un'idea di cosa può causare il problema?
Potrebbe essere necessario dare un'occhiata all'IL e al codice macchina emessi. – Rob
Lavoro con il team .NET Native Compiler and Runtime.Di solito utilizziamo PerfView per questo tipo di indagini. Se riesci a raccogliere alcune tracce di etl (una con .net nativa e una senza) e le abbiamo inviate a nostra maniera ([email protected]), vedremo qualcuno che le darà un'occhiata. –
Potrebbe essere un inaridimento del pool di thread. Hai giocato con 'ThreadPool.SetMinThreads/SetMaxThreads'? – Noseratio