Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.10.2011, 11:57   #1
ordoss
Пользователь
 
Регистрация: 03.01.2010
Сообщений: 41
Восклицание Скорость операций сhecked и unchecked

Задача такова: сравнить время выполения и потребление памяти операций сhecked и unchecked для типов int и double

Вот мой код:
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;

namespace ConsoleApplication1
{
    class Program
    {
        private static long N = 2000000000;

        static void Main(string[] args)
        {
            DateTime t1, t2;
            double m1, m2;
            Process[] processlist = Process.GetProcessesByName("ConsoleApplication1.vshost");
            int TestI = 1250;
            double TestD = 2500.25;


        L1: t1 = DateTime.Now;
            processlist[0].Refresh();
            m1 = processlist[0].PagedMemorySize64 / 1024.0 / 1024.0;
            for (int i = 0; i < N; i++)
                TestI = checked(TestI);
            processlist[0].Refresh();
            m2 = processlist[0].PagedMemorySize64 / 1024.0 / 1024.0;
            t2 = DateTime.Now;
            Console.WriteLine("Time checked int: " + (t2 - t1));
            Console.WriteLine("Memory: " + (m2 - m1));


            t1 = DateTime.Now;
            processlist[0].Refresh();
            m1 = processlist[0].PagedMemorySize64 / 1024.0 / 1024.0;
            for(int i = 0; i < N; i++)
                TestD = checked(TestD);
            processlist[0].Refresh();
            m2 = processlist[0].PagedMemorySize64 / 1024.0 / 1024.0;
            t2 = DateTime.Now;
            Console.WriteLine("Time checked double: " + (t2 - t1));
            Console.WriteLine("Memory: " + (m2 - m1));


            t1 = DateTime.Now;
            processlist[0].Refresh();
            m1 = processlist[0].PagedMemorySize64 / 1024.0 / 1024.0;
            for (int i = 0; i < N; i++)
                TestI = unchecked(TestI);
            m2 = processlist[0].PagedMemorySize64 / 1024.0 / 1024.0;
            t2 = DateTime.Now;
            Console.WriteLine("Time unchecked int: " + (t2 - t1));
            Console.WriteLine("Memory: " + (m2 - m1));


            t1 = DateTime.Now;
            processlist[0].Refresh();
            m1 = processlist[0].PagedMemorySize64 / 1024.0 / 1024.0;
            for (int i = 0; i < N; i++)
                TestD = unchecked(TestD);
            m2 = processlist[0].PagedMemorySize64 / 1024.0 / 1024.0;
            t2 = DateTime.Now;
            Console.WriteLine("Time unchecked double: " + (t2 - t1));
            Console.WriteLine("Memory: " + (m2 - m1));

            Console.ReadLine();
            goto L1;
        }
    }
}
Иногда получаю странные результаты: отрицательное использование памяти, операции над int выполняются то быстрее, то медленее. В чем моя ошибка?

ordoss вне форума Ответить с цитированием
Старый 03.10.2011, 12:33   #2
Guy
Форумчанин
 
Регистрация: 15.12.2010
Сообщений: 398
По умолчанию

Судя по названию "ConsoleApplication1.vshost" вы замеряете значения в .net сборке, а как там себя видёт CLR сложно предсказать Он может то начинать очищать память то выделять для повышения производительности
Guy вне форума Ответить с цитированием
Старый 03.10.2011, 13:19   #3
ordoss
Пользователь
 
Регистрация: 03.01.2010
Сообщений: 41
По умолчанию

Guy, я тоже думаю, что это GC вставляет палки в колеса, может есть способ отключить сборку мусора на время замеров?
ordoss вне форума Ответить с цитированием
Старый 03.10.2011, 13:37   #4
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию

Можно вручную собирать мусор перед каждым замером памяти.

http://msdn.microsoft.com/ru-ru/library/xe0c2357.aspx
ds.Dante вне форума Ответить с цитированием
Старый 03.10.2011, 14:00   #5
ordoss
Пользователь
 
Регистрация: 03.01.2010
Сообщений: 41
По умолчанию

ds.Dante, теперь результат еще более странный:


Код:
            t1 = DateTime.Now;
            GC.Collect();
            processlist[0].Refresh();
            m1 = processlist[0].PagedMemorySize64 / 1024.0 / 1024.0;
            for (long i = 0; i < N; i++)
                TestI = checked(TestI);
            processlist[0].Refresh();
            m2 = processlist[0].PagedMemorySize64 / 1024.0 / 1024.0;
            t2 = DateTime.Now;
            Console.WriteLine("Time checked int:      " + (t2 - t1));
            Console.WriteLine("Memory: " + (m2 - m1));


            t1 = DateTime.Now;
            GC.Collect();
            processlist[0].Refresh();
            m1 = processlist[0].PagedMemorySize64 / 1024.0 / 1024.0;
            for(long i = 0; i < N; i++)
                TestD = checked(TestD);
            processlist[0].Refresh();
            m2 = processlist[0].PagedMemorySize64 / 1024.0 / 1024.0;
            t2 = DateTime.Now;
            Console.WriteLine("Time checked double:   " + (t2 - t1));
            Console.WriteLine("Memory: " + (m2 - m1));


            t1 = DateTime.Now;
            GC.Collect();
            processlist[0].Refresh();
            m1 = processlist[0].PagedMemorySize64 / 1024.0 / 1024.0;
            for (long i = 0; i < N; i++)
                TestI = unchecked(TestI);
            m2 = processlist[0].PagedMemorySize64 / 1024.0 / 1024.0;
            t2 = DateTime.Now;
            Console.WriteLine("Time unchecked int:    " + (t2 - t1));
            Console.WriteLine("Memory: " + (m2 - m1));


            t1 = DateTime.Now;
            GC.Collect();
            processlist[0].Refresh();
            m1 = processlist[0].PagedMemorySize64 / 1024.0 / 1024.0;
            for (long i = 0; i < N; i++)
                TestD = unchecked(TestD);
            m2 = processlist[0].PagedMemorySize64 / 1024.0 / 1024.0;
            t2 = DateTime.Now;
            Console.WriteLine("Time unchecked double: " + (t2 - t1));
            Console.WriteLine("Memory: " + (m2 - m1));
ordoss вне форума Ответить с цитированием
Старый 03.10.2011, 14:13   #6
Guy
Форумчанин
 
Регистрация: 15.12.2010
Сообщений: 398
По умолчанию

поробуй в эту сторону капнуть
http://msdn.microsoft.com/ru-ru/libr...talmemory.aspx

Или у тебя задание точно определить изменеия ? Попробуй в этой функции побольше нагурзку дать возможно сразу изменеия заметны будут
Guy вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Число операций на С IvaneOK Общие вопросы C/C++ 1 22.05.2011 15:06
Скорость рисования и остальная скорость ZotaC Gamedev - cоздание игр: Unity, OpenGL, DirectX 121 13.11.2010 22:51
перегрузка операций nastya081108 Помощь студентам 0 18.05.2010 21:16
исследование операций zajigalka Помощь студентам 1 25.04.2010 11:30
Скорость обработки операций Alex Cones Общие вопросы Delphi 8 05.06.2009 20:17