Sto facendo un po 'di benchmark per determinare se posso usare WPF per un nuovo prodotto. Tuttavia, i primi risultati delle prestazioni sono deludenti. Ho creato un'app rapida che utilizza l'associazione dati per visualizzare un gruppo di testo casuale all'interno di una casella di riepilogo ogni 100 ms e si stava consumando circa il 15% di CPU. Così ho fatto un'altra app rapida che saltava lo schema di data binding/data template e non fa altro che aggiornare 10 TextBlocks che si trovano all'interno di un ListBox ogni 100 ms (il prodotto attuale non richiederebbe aggiornamenti di 100 ms, più come 500 ms max, ma questo è un test di stress). Sto ancora vedendo ~ 5-10% di utilizzo della CPU. Perché è così alto? È a causa di tutti i fili della spazzatura?Si prevede questa prestazione WPF TextBlock lenta?
Ecco il codice XAML per la versione che non utilizza vincolante:
<Grid>
<ListBox x:Name="numericsListBox">
<ListBox.Resources>
<Style TargetType="TextBlock">
<Setter Property="FontSize" Value="48"/>
<Setter Property="Width" Value="300"/>
</Style>
</ListBox.Resources>
<TextBlock/>
<TextBlock/>
<TextBlock/>
<TextBlock/>
<TextBlock/>
<TextBlock/>
<TextBlock/>
<TextBlock/>
<TextBlock/>
<TextBlock/>
</ListBox>
</Grid>
Ecco il codice dietro:
public partial class Window1 : Window
{
private int _count = 0;
public Window1()
{
InitializeComponent();
}
private void OnLoad(object sender, RoutedEventArgs e)
{
var t = new DispatcherTimer(TimeSpan.FromSeconds(0.1), DispatcherPriority.Normal, UpdateNumerics, Dispatcher);
t.Start();
}
private void UpdateNumerics(object sender, EventArgs e)
{
++_count;
foreach (object textBlock in numericsListBox.Items)
{
var t = textBlock as TextBlock;
if (t != null)
t.Text = _count.ToString();
}
}
}
che consuma ~ 5-10% della CPU in base al Task Manager, o fino a circa il 20% di uno dei nuclei! Qualche idea per un modo migliore per rendere rapidamente il testo?
Il mio computer: XP SP3, 2,22 GHz Core 2 Duo, 4 GB di RAM, grafica integrata Intel 4500 HD. E questo è un ordine di grandezza più potente dell'hardware che avrei bisogno di sviluppare nel prodotto reale.
Nel binding WPF non è esattamente il modo in cui l'hai fatto a proposito. –
Non ho inserito il codice per la versione che ha utilizzato l'associazione (e anche il pattern MVVM). Ho pensato che questa versione sarebbe ancora più leggera e rappresenta un esempio migliore. –
La maggior parte dei cicli della CPU dovrebbe essere masterizzata sul rendering qui. Ma usa un profiler per essere sicuro. Ecco una recensione del tuo hardware grafico * very * poky: http://pcgamingcorner.com/wordpress/?p=820 –