Benchmarking. Замеры времени выполнения кода

Класс Benchmark использует статическое свойство TickCount класса System.Environment, которое возвращает время, истекшее с момента загрузки системы (в миллисекундах). Будем использовать этот класс для замера времени выполнения сортировки с помощью метода Array.Sort() и пользовательского метода heapSort() - пирамидальная сортировка.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Management;
using System.Diagnostics;

namespace Benchmark
{
    class Benchmark
    {
        private long Start;
        private long Stop;
        public Benchmark() { }
        public Benchmark(bool IsStart)
        {
            if (IsStart)
                Start = Environment.TickCount;
        }
        public void StartCounting()
        {
            Start = Environment.TickCount;
        }
        public void StopCounting()
        {
            Stop = Environment.TickCount;
        }
        public int ElapsedTime()
        {
            return (int)(Stop - Start);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Random rnd = new Random();
            int size = 100000000;
            Console.WriteLine("Частота процессора: {0} GHz, Объем оперативной памяти: {1} Mbytes", GetCPUSpeed(), GetTotalPhysicalMemory());
            
            Benchmark benchmark = new Benchmark(true);
            int[] array = new int[size];
            for (int i = 0; i < size; i++)
                array[i] = rnd.Next();
            benchmark.StopCounting();
            
            Console.WriteLine("Массив размером {0} сгенерирован случайными числами за {1} мс", size.ToString("# ### ### ###"), benchmark.ElapsedTime());
            int[] arrayCopy = new int[size];
            
            array.CopyTo(arrayCopy, 0);
            benchmark.StartCounting();
            Array.Sort(arrayCopy);
            benchmark.StopCounting();
            Console.WriteLine("Массив размером {0} отсортирован с помощью Array.Sort() за {1} мс", size.ToString("# ### ### ###"), benchmark.ElapsedTime());
            
            array.CopyTo(arrayCopy, 0);
            benchmark.StartCounting();
            heapSort(ref arrayCopy);
            benchmark.StopCounting();
            Console.WriteLine("Массив размером {0} отсортирован с помощью heapSort() за {1} мс", size.ToString("# ### ### ###"), benchmark.ElapsedTime());
            
            Console.ReadKey();
        }
        static long GetTotalPhysicalMemory()
        {
            ManagementObject Mo = new ManagementObject("Win32_ComputerSystem='" + Environment.MachineName + "'");
            object bytes = (Mo["TotalPhysicalMemory"]);
            Mo.Dispose();
            return (long)(Convert.ToInt64(bytes.ToString()) / (1024 * 1024));
        }
        static uint GetCPUSpeed()
        {
            ManagementObject Mo = new ManagementObject("Win32_Processor.DeviceID='CPU0'");
            uint sp = (uint)(Mo["CurrentClockSpeed"]);
            Mo.Dispose();
            return sp;
        }
        static void sift(ref int[] array, int L, int R)
        {
            int i, j;
            int item;
            i = L;
            j = 2 * L;
            item = array[L];
            if (j < R && array[j] < array[j + 1])
                j++;
            while (j <= R && item < array[j])
            {
                array[i] = array[j];
                i = j;
                j = 2 * j;
                if (j < R && array[j] < array[j + 1])
                    j++;
            }
            array[i] = item;
        }
        static void heapSort(ref int[] array)
        {
            int size = array.Count();
            int L, R;
            int item;
            L = size / 2;
            R = size - 1;
            while (L > 0)
            {
                L--;
                sift(ref array, L, R);
            }
            while (R > 0)
            {
                item = array[0];
                array[0] = array[R];
                array[R] = item;
                R--;
                sift(ref array, L, R);
            }
        }
    }
}

bench1.png
--
автор:Балаян Артур

Last edited Jan 31, 2012 at 10:18 AM by basph, version 3

Comments

No comments yet.