csharp/ABTSoftware/SciChart.Wpf.Examples/Sandbox/WPFChartPerformanceBenchmark/WPFChartPerformanceBenchmark/MainViewModel.cs

MainViewModel.cs
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using ChartProviders.Common;

namespace WPFChartPerformanceBenchmark
{
    public clast MainViewModel : ViewModelBase
    {
        private Queue _testQueue = new Queue();
        private ObservableCollection _testRuns = new ObservableCollection();
        private ObservableCollection _testResults = new ObservableCollection();
        private ObservableCollection _columns = new ObservableCollection();
        private readonly IChartingProvider[] _chartProviders;
        private HeatProvider _heatProvider;

        public MainViewModel()
        {
            // Maps FPS to brushes for grid
            _heatProvider = new HeatProvider(0, 60);

            var testNameColumn = new DataGridTextColumn { Binding = new Binding("TestName"), Header = "Test Name" };
            _columns.Add(testNameColumn);

            // Gets the Charting Providers (which test groups to run)
            _chartProviders = TestSetup.GetChartProviders();

            // Create columns
            foreach (var chartingProvider in _chartProviders)
            {
                // On result, bind the cell background to output of _heatProvider;
                var resultBinding = new Binding("[" + chartingProvider.Name + "]")
                {
                    StringFormat = "N2"
                };

                var backgroundBinding = new Binding("[" + chartingProvider.Name + "]")
                {
                    Converter = new HeatConverter(_heatProvider)
                };

                var textBlock = new FrameworkElementFactory(typeof(TextBlock));
                textBlock.SetValue(TextBlock.MarginProperty, new Thickness(0));
                textBlock.SetValue(TextBlock.PaddingProperty, new Thickness(3));

                textBlock.SetBinding(TextBlock.BackgroundProperty, backgroundBinding);
                textBlock.SetBinding(TextBlock.TextProperty, resultBinding);
                var col = new DataGridTemplateColumn
                    {
                        CellTemplate = new DataTemplate() { VisualTree = textBlock },
                        Header = chartingProvider.Name
                    };
                _columns.Add(col);
            }

            // Create test cases. We transpose the matrix of cases so they are performed in the order
            //   Test1    (1)Version1    (2)Version2    (3)Version3
            //   Test3    (4)Version1    (5)Version2    (6)Version3
            // to avoid problem of CPU heating causing throttling and later versions looking slower

            var allSpeedTests = _chartProviders.SelectMany(this.CreateTestCases).OrderBy(tc => tc.TestNumber);
            foreach (var speedTest in allSpeedTests)
            {
                _testQueue.Enqueue(speedTest);
            }
        }

        public ObservableCollection Columns
        {
            get { return _columns; }
            set
            {
                if (_columns == value) return;
                _columns = value;
                OnPropertyChanged("Columns");
            }
        }


        public ObservableCollection TestRuns
        {
            get { return _testRuns; }
            set
            {
                if (_testRuns == value) return;
                _testRuns = value;
                OnPropertyChanged("TestRuns");
            }
        }

        public ObservableCollection Results
        {
            get { return _testResults; }
            set
            {
                if (_testResults == value) return;
                _testResults = value;
                OnPropertyChanged("Results");
            }
        }

        private IEnumerable CreateTestCases(IChartingProvider chartingProvider)
        {
            TimeSpan duration = TimeSpan.FromSeconds(10); // Per test
            int i = 1; // Test Number
            List listTestCases = new List();

            //ChartProviders.Common.Resampling sciChartResampling = Resampling.None; 
            ChartProviders.Common.Resampling sciChartResampling = Resampling.Auto; 
            
            TestRunnerType runnerType = TestRunnerType.Composition;
            // (TestRunnerType runnerType = TestRunnerType.DispatcherTimer; runnerType 
                {
                    LayoutRoot.Children.Remove(testCase.SpeedTestUi);

                    // log the test run
                    _testRuns.Add(string.Format("({0:N2}) - {1} - {2}", result, testCase.TestCaseName, testCase.Version));

                    // add results to the table
                    var testResult = _testResults.SingleOrDefault(i => i.TestName == testCase.TestCaseName);
                    if (testResult == null)
                    {
                        testResult = new TestResult()
                        {
                            TestName = testCase.TestCaseName
                        };
                        _testResults.Add(testResult);
                    }
                    testResult[testCase.Version] = result;
                    string strPrefix = "LC";
                    if (_iTestResult % 2 == 0)
                    {
                        strPrefix = "SC";
                    }
                    else
                    {
                        strPrefix = "LC";
                    } 
                    //Write to log 
                    WriteLog(testCase.TestCaseName + ";" + result.ToString("0.0") + ";", System.AppDomain.CurrentDomain.BaseDirectory + "\\"+strPrefix+"_PerformanceComparisonDump.csv");
                    _iTestResult++; 
                    // start the next test
                    TestFinished(testCase, result);
                });
        }

        private void TestFinished(TestCase testCase, double result)
        {
            testCase.Dispose();
            GC.Collect();
            GC.WaitForPendingFinalizers();
            GC.Collect();
            
            RunNextTest();
        }

        /// 
        /// Write a string to log file. 
        /// 
        /// String to write
        /// File name
        public static void WriteLog(string entry, string fileName)
        {
            string strPath = fileName;
            System.IO.StreamWriter sw;
            if (System.IO.File.Exists(strPath))
                sw = System.IO.File.AppendText(strPath);
            else
                sw = System.IO.File.CreateText(strPath);
            if (sw != null)
            {
                sw.WriteLine(entry + "[" + DateTime.Now.ToLongTimeString() + "]");
                sw.Close();
            }

        }
    }
}