Sei modifiche chieste in questa sessione, di cui una pesa piu' di tutte le altre. CompletedAuctionsStore rileggeva e rideserializzava l'intero file a ogni chiamata: misurati 72 ms su 5876 record, 3,9 MB. Append pagava quel prezzo piu' la riserializzazione e la riscrittura completa per cambiare un record solo, 120 ms in tutto, e la chiamata arriva da un gestore di eventi di MainWindow, quindi dal thread dell'interfaccia, che restava fermo a ogni asta conclusa. Il recupero delle puntate dei vincitori lo faceva in un ciclo: 4675 aste erano 7,2 minuti di solo rimescolamento JSON e 17,8 GB scritti sul disco. Adesso c'e' una copia in memoria invalidata sulla data di modifica del file, cosi' resta giusta anche se il file viene sostituito da fuori (ripristino di un backup), e un AppendMany che applica molti record con un salvataggio solo, con un indice per id perche' il caso per cui esiste non torni quadratico. Il recupero salva a blocchi di cinquanta e deposita comunque quello che ha in mano quando esce, anche per annullamento: le richieste gia' fatte sono state pagate al server. Misurato sullo stesso file: 95 volte piu' veloce, 7,2 minuti diventano 4,5 secondi, 17,8 GB diventano 0,36 GB. Le altre cinque: - Il setup si chiama AutoBidder_<versione>.exe. - I pulsanti di stop sono rossi, sia quello globale sia quelli per asta nella griglia: erano gli unici tre senza colore mentre avvia e osserva ce l'avevano. - La pulizia dello storico sa togliere le aste seguite solo in parte. Non serve nessun campo nuovo: il prezzo finale in centesimi e' il totale delle puntate dell'asta, quindi il rapporto con i reset osservati dice quanta asta si e' vista, e la regola vale anche sullo storico gia' raccolto. Verificata sui dati veri: su 5876 aste nessuna supera copertura 1,02, che e' quanto ci si aspetta se l'identita' e' giusta. - La griglia ricicla i contenitori di riga invece di ricrearli. - Il costo puntata gia' esisteva col predefinito giusto: al suggerimento e' stato aggiunto perche' 0,20 e' il numero da tenere. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
96 lines
6.1 KiB
XML
96 lines
6.1 KiB
XML
<Window x:Class="AutoBidder.Dialogs.StatsCleanupDialog"
|
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
|
Title="Pulizia dello storico"
|
|
Width="620" SizeToContent="Height"
|
|
WindowStartupLocation="CenterOwner"
|
|
ShowInTaskbar="False"
|
|
Background="{DynamicResource Brush.Bg}">
|
|
|
|
<StackPanel Margin="22,18">
|
|
|
|
<TextBlock Text="Cosa considerare incompleto"
|
|
FontSize="{StaticResource Font.Size.Lg}" FontWeight="SemiBold"
|
|
Foreground="{DynamicResource Brush.Text}"/>
|
|
|
|
<TextBlock Style="{StaticResource Hint}" Margin="0,6,0,14"
|
|
Text="Il conto si aggiorna mentre scegli. Niente viene toccato finché non premi Pulisci, e viene salvata una copia dello storico prima di procedere."/>
|
|
|
|
<CheckBox x:Name="ChkNoPrice" Margin="0,4" IsChecked="True"
|
|
Content="Aste senza prezzo finale"
|
|
ToolTip="Non dicono nulla e sporcano ogni media: il prezzo è il dato su cui si regge tutto il resto."
|
|
Checked="Option_Changed" Unchecked="Option_Changed"/>
|
|
|
|
<CheckBox x:Name="ChkBadBids" Margin="0,4" IsChecked="True"
|
|
Content="Aste con puntate del vincitore incoerenti col prezzo"
|
|
ToolTip="Ogni puntata alza il prezzo di un centesimo, quindi il prezzo in centesimi è il totale delle puntate dell'asta. Un vincitore che ne dichiara di più — o zero — porta un dato che non può essere vero."
|
|
Checked="Option_Changed" Unchecked="Option_Changed"/>
|
|
|
|
<CheckBox x:Name="ChkDuplicates" Margin="0,4" IsChecked="True"
|
|
Content="Doppioni con lo stesso identificativo (tiene il più recente)"
|
|
ToolTip="La stessa asta può essere registrata due volte: quando il motore ne vede la fine e quando viene tolta dal monitor. Si tiene la versione più recente."
|
|
Checked="Option_Changed" Unchecked="Option_Changed"/>
|
|
|
|
<CheckBox x:Name="ChkNoWinnerBids" Margin="0,4"
|
|
Content="Aste di cui non si conoscono le puntate del vincitore"
|
|
ToolTip="Severo: toglie tutte le aste su cui non si può calcolare il costo reale. Prima di usarlo, prova «Recupera puntate dei vincitori» nella scheda Storico — il dato si può quasi sempre riprendere dal server."
|
|
Checked="Option_Changed" Unchecked="Option_Changed"/>
|
|
|
|
<CheckBox x:Name="ChkNoWinner" Margin="0,4"
|
|
Content="Aste senza vincitore"
|
|
ToolTip="Aste scadute senza offerte, oppure registrate a metà."
|
|
Checked="Option_Changed" Unchecked="Option_Changed"/>
|
|
|
|
<CheckBox x:Name="ChkNoValue" Margin="0,4"
|
|
Content="Aste senza valore del prodotto"
|
|
ToolTip="Senza il «Compra Subito» non si può calcolare il risparmio, ma il prezzo e le puntate restano validi."
|
|
Checked="Option_Changed" Unchecked="Option_Changed"/>
|
|
|
|
<StackPanel Orientation="Horizontal" Margin="0,10,0,0">
|
|
<CheckBox x:Name="ChkCoverage" VerticalAlignment="Center"
|
|
Content="Aste seguite per meno del"
|
|
ToolTip="Toglie le aste agganciate a metà. Sono il caso peggiore: i numeri sono veri ma parziali, quindi sembrano buone e abbassano le medie senza dare segnali. Quanta asta si è vista si ricava dal prezzo finale, senza bisogno di alcun dato in più: ogni puntata vale un centesimo, quindi il prezzo in centesimi è il totale delle puntate dell'asta, e i reset osservati dicono quanti se ne sono visti. Sul tuo storico, su 5876 aste: al 75% ne resterebbero circa 78 su 100, al 90% circa 64, al 95% circa 54, al 99% circa 34."
|
|
Checked="Option_Changed" Unchecked="Option_Changed"/>
|
|
<TextBox x:Name="CoverageBox" Text="90" Width="50" Margin="8,0"
|
|
VerticalAlignment="Center" TextChanged="Option_Changed"/>
|
|
<TextBlock Text="% della loro durata" VerticalAlignment="Center"
|
|
Foreground="{DynamicResource Brush.Text}"/>
|
|
</StackPanel>
|
|
|
|
<StackPanel Orientation="Horizontal" Margin="0,10,0,0">
|
|
<CheckBox x:Name="ChkOlderThan" VerticalAlignment="Center"
|
|
Content="Aste chiuse da più di"
|
|
ToolTip="Le aste vecchie descrivono un mercato che può essere cambiato."
|
|
Checked="Option_Changed" Unchecked="Option_Changed"/>
|
|
<TextBox x:Name="DaysBox" Text="180" Width="60" Margin="8,0"
|
|
VerticalAlignment="Center" TextChanged="Option_Changed"/>
|
|
<TextBlock Text="giorni" VerticalAlignment="Center"
|
|
Foreground="{DynamicResource Brush.Text}"/>
|
|
</StackPanel>
|
|
|
|
<Border Style="{StaticResource InfoBox}" Margin="0,16,0,0">
|
|
<StackPanel>
|
|
<TextBlock x:Name="SummaryText" TextWrapping="Wrap"
|
|
Foreground="{DynamicResource Brush.Text}"
|
|
FontSize="{StaticResource Font.Size.Sm}" LineHeight="18"
|
|
Text="Calcolo…"/>
|
|
<TextBlock x:Name="DetailText" TextWrapping="Wrap" Margin="0,8,0,0"
|
|
Foreground="{DynamicResource Brush.TextMuted}"
|
|
FontSize="{StaticResource Font.Size.Sm}" LineHeight="17"/>
|
|
</StackPanel>
|
|
</Border>
|
|
|
|
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Margin="0,18,0,0">
|
|
<Button x:Name="CleanButton" Content="Pulisci" Padding="26,7" Margin="0,0,10,0"
|
|
Style="{StaticResource ModernButton}"
|
|
Background="{DynamicResource Brush.Danger}"
|
|
Foreground="{DynamicResource Brush.TextOnAccent}"
|
|
Click="Clean_Click"/>
|
|
<Button Content="Annulla" Padding="26,7"
|
|
Style="{StaticResource ModernButton}"
|
|
Background="{DynamicResource Brush.SurfaceAlt}"
|
|
IsCancel="True"/>
|
|
</StackPanel>
|
|
</StackPanel>
|
|
</Window>
|