CarouselPagePerformancePage.xaml.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. using System;
  2. using System.Collections;
  3. using Avalonia.Controls;
  4. using Avalonia.Interactivity;
  5. using Avalonia.Layout;
  6. namespace ControlCatalog.Pages
  7. {
  8. public partial class CarouselPagePerformancePage : UserControl
  9. {
  10. private readonly NavigationPerformanceMonitorHelper _perf = new();
  11. private int _counter;
  12. public CarouselPagePerformancePage()
  13. {
  14. InitializeComponent();
  15. Loaded += OnLoaded;
  16. Unloaded += OnUnloaded;
  17. }
  18. private void OnLoaded(object? sender, RoutedEventArgs e)
  19. {
  20. AddPages(5);
  21. DemoCarousel.SelectionChanged += OnSelectionChanged;
  22. }
  23. private void OnUnloaded(object? sender, RoutedEventArgs e)
  24. {
  25. DemoCarousel.SelectionChanged -= OnSelectionChanged;
  26. }
  27. private void OnSelectionChanged(object? sender, PageSelectionChangedEventArgs e) => RefreshStats();
  28. private void AddPages(int count)
  29. {
  30. var pages = (IList)DemoCarousel.Pages!;
  31. _perf.OpStopwatch.Restart();
  32. for (int i = 0; i < count; i++)
  33. {
  34. var idx = ++_counter;
  35. var page = new ContentPage
  36. {
  37. Header = $"P{idx}",
  38. Content = new TextBlock
  39. {
  40. Text = $"Page {idx}",
  41. HorizontalAlignment = HorizontalAlignment.Center,
  42. VerticalAlignment = VerticalAlignment.Center,
  43. FontSize = 18,
  44. Opacity = 0.7
  45. },
  46. Tag = new byte[51200],
  47. };
  48. _perf.TrackPage(page);
  49. pages.Add(page);
  50. }
  51. _perf.StopMetrics(LastOpTimeText);
  52. RefreshStats();
  53. }
  54. private void RemovePages(int count)
  55. {
  56. var pages = (IList)DemoCarousel.Pages!;
  57. _perf.OpStopwatch.Restart();
  58. for (int i = 0; i < count && pages.Count > 0; i++)
  59. pages.RemoveAt(pages.Count - 1);
  60. _perf.StopMetrics(LastOpTimeText);
  61. RefreshStats();
  62. }
  63. private void OnAdd5(object? sender, RoutedEventArgs e) => AddPages(5);
  64. private void OnAdd20(object? sender, RoutedEventArgs e) => AddPages(20);
  65. private void OnRemove5(object? sender, RoutedEventArgs e) => RemovePages(5);
  66. private void OnClearAll(object? sender, RoutedEventArgs e)
  67. {
  68. var pages = (IList)DemoCarousel.Pages!;
  69. _perf.OpStopwatch.Restart();
  70. while (pages.Count > 0)
  71. pages.RemoveAt(pages.Count - 1);
  72. _perf.StopMetrics(LastOpTimeText);
  73. RefreshStats();
  74. }
  75. private void OnForceGC(object? sender, RoutedEventArgs e)
  76. {
  77. _perf.ForceGC(RefreshStats);
  78. }
  79. private void OnRefresh(object? sender, RoutedEventArgs e) => RefreshStats();
  80. private void RefreshStats()
  81. {
  82. var pages = (IList)DemoCarousel.Pages!;
  83. PageCountText.Text = $"Page count: {pages.Count}";
  84. LiveCountText.Text = $"Live instances: {_perf.CountLiveInstances()} / {_perf.TotalCreated} tracked";
  85. HeapText.Text = $"Heap: {GC.GetTotalMemory(false) / 1024:N0} KB";
  86. AllocText.Text = $"Total allocated: {GC.GetTotalAllocatedBytes() / 1024:N0} KB";
  87. }
  88. }
  89. }