TransitionBenchmark.cs 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.Reactive.Linq;
  5. using System.Reactive.Subjects;
  6. using System.Runtime.CompilerServices;
  7. using Avalonia.Animation;
  8. using Avalonia.Animation.Animators;
  9. using Avalonia.Layout;
  10. using BenchmarkDotNet.Attributes;
  11. namespace Avalonia.Benchmarks.Animations
  12. {
  13. [MemoryDiagnoser]
  14. public class TransitionBenchmark
  15. {
  16. private readonly AddValueObserver _observer;
  17. private readonly List<double> _producedValues;
  18. private readonly Subject<double> _timeProducer;
  19. private readonly DoubleTransition _transition;
  20. public TransitionBenchmark()
  21. {
  22. _transition = new DoubleTransition
  23. {
  24. Duration = TimeSpan.FromMilliseconds(FrameCount), Property = Layoutable.WidthProperty
  25. };
  26. _timeProducer = new Subject<double>();
  27. _producedValues = new List<double>(FrameCount);
  28. _observer = new AddValueObserver(_producedValues);
  29. }
  30. [Params(10, 100)] public int FrameCount { get; set; }
  31. [Benchmark]
  32. [MethodImpl(MethodImplOptions.NoInlining)]
  33. public void NewTransition()
  34. {
  35. var transitionObs = _transition.DoTransition(_timeProducer, 0, 1);
  36. _producedValues.Clear();
  37. using var transitionSub = transitionObs.Subscribe(_observer);
  38. for (int i = 0; i < FrameCount; i++)
  39. {
  40. _timeProducer.OnNext(i / 1000d);
  41. }
  42. Debug.Assert(_producedValues.Count == FrameCount);
  43. }
  44. private class AddValueObserver : IObserver<double>
  45. {
  46. private readonly List<double> _values;
  47. public AddValueObserver(List<double> values)
  48. {
  49. _values = values;
  50. }
  51. public void OnCompleted()
  52. {
  53. }
  54. public void OnError(Exception error)
  55. {
  56. }
  57. public void OnNext(double value)
  58. {
  59. _values.Add(value);
  60. }
  61. }
  62. }
  63. }