Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Геморрой с тиками и наносекундами


Автор: VisualProgrammerNET 30.10.2007, 18:49
Привожу в пример участок кода, время выполнения которого надо замерить
Код

            long freq = System.Diagnostics.Stopwatch.Frequency; //замеряем тик
            long nanosec = (1000L * 1000L * 1000L) / freq; //переводим в наносекунды за тик
            long ftime = 0;
            long stime = DateTime.Now.Ticks; //пуск           
            WaveAlgorithm.AnalyzeField(this.currentfield);
            WaveAlgorithm.CalculatePath();
            WaveAlgorithm.SelectPath(DirectionPriority.RULD);            
            this.SetStatusState("Locked");
            this.locked = true;
            this.Invalidate();
            ftime = (DateTime.Now.Ticks - stime) * nanosec; //всё сделано, смотрим секундомер


В итоге переменная ftime всегда равняется какому-то из нескольких определённых значений, никаких отклонений ваще. Неважно, какие были условия задачи, алгоритм, судя по этой переменной, всегда выполняется либо за период А, либо за период Б, либо за В. Вплоть до наносекунды. Такого ведь не может быть, само собой. В чём тут подвох, никак не пойму?  smile 

Автор: Mad 30.10.2007, 20:02
Цитата(VisualProgrammerNET @  30.10.2007,  17:49 Найти цитируемый пост)
В чём тут подвох, никак не пойму?

Может в том, что самое точное значение, которое тебе возвращаеться системмой, идет с шагом в милисекунду ?
(ну и соответственно, как ты с ним не изголяйся, точней чем мидисекунда не получиш)

Добавлено через 1 минуту и 18 секунд
ниговоря уже о том, что nanosec неплохобы хотябы float сделать

Автор: Experimenter 30.10.2007, 20:37
Mad, а вообще не тактовой ли частотой процессора точность определяется? а также моментом времени, которое процессор твоему приложению выделяет на обработку (125 мс)?

Автор: VisualProgrammerNET 30.10.2007, 21:42
Короче видимо придётся отказаться от этой затеи... Подскажите плиз толковый измеритель времени выполнения кода. 

Автор: tol05 30.10.2007, 23:18
Цитата(VisualProgrammerNET @  30.10.2007,  21:42 Найти цитируемый пост)
толковый измеритель времени выполнения кода

ИМХО то, что тебе нужно - http://memprofiler.com/  smile 

А вообще, я когда-то пробовал http://www.codeproject.com/csharp/CS_Stopwatch.asp?df=100&forumid=257369&exp=0&select=1338229


Автор: coSSinuSS 16.11.2007, 11:36
Цитата(VisualProgrammerNET @ 30.10.2007,  18:49)
Привожу в пример участок кода, время выполнения которого надо замерить
Код

            long freq = System.Diagnostics.Stopwatch.Frequency; //замеряем тик
            long nanosec = (1000L * 1000L * 1000L) / freq; //переводим в наносекунды за тик
            long ftime = 0;
            long stime = DateTime.Now.Ticks; //пуск           
            WaveAlgorithm.AnalyzeField(this.currentfield);
            WaveAlgorithm.CalculatePath();
            WaveAlgorithm.SelectPath(DirectionPriority.RULD);            
            this.SetStatusState("Locked");
            this.locked = true;
            this.Invalidate();
            ftime = (DateTime.Now.Ticks - stime) * nanosec; //всё сделано, смотрим секундомер


В итоге переменная ftime всегда равняется какому-то из нескольких определённых значений, никаких отклонений ваще. Неважно, какие были условия задачи, алгоритм, судя по этой переменной, всегда выполняется либо за период А, либо за период Б, либо за В. Вплоть до наносекунды. Такого ведь не может быть, само собой. В чём тут подвох, никак не пойму?  smile

ИМХО борька, этот татализатор выиграл я, ибо у меня все работает на ура и считает хоть с точностью и не до наносекунды, но милисекунды считает прально  smile 

Автор: Bogdan1024 16.11.2007, 12:03
Цитата
Может в том, что самое точное значение, которое тебе возвращаеться системмой, идет с шагом в милисекунду ?
(ну и соответственно, как ты с ним не изголяйся, точней чем мидисекунда не получиш)

Определять время вполь до микросекунд можно с помощью ассемблера   smile 

Автор: archeg 16.11.2007, 14:41
Вот у меня такой вопрос по теме. Винда ведь делит процессорное время для много-много потоков. И для того чтобы один процессор обработал много потоков винда делит каждый поток на (забыл как называется) - куски потоков. 

Например этот код:
Код

            //-------------------- Тут процессор начал обрабатывать поток-----------------------------------
            long freq = System.Diagnostics.Stopwatch.Frequency; //замеряем тик
            long nanosec = (1000L * 1000L * 1000L) / freq; //переводим в наносекунды за тик
            long ftime = 0;
            long stime = DateTime.Now.Ticks; //пуск           
            WaveAlgorithm.AnalyzeField(this.currentfield);
            // ------------------- К примеру тут он поток приостановил и обработал десяток других потоков
            //-------------------- Потом снова возобновил работу потока------------------------------------------
            WaveAlgorithm.CalculatePath();
            WaveAlgorithm.SelectPath(DirectionPriority.RULD);            
            this.SetStatusState("Locked");
            this.locked = true;
            this.Invalidate();
            //-------------------- Ну и мы посчитали сумарное время-------------------------------------------------
            ftime = (DateTime.Now.Ticks - stime) * nanosec; //всё сделано, смотрим секундомер            

Так как можно говорить про точный замер времени, если в это время мы даже не уверены сколько потоков было выполнено?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)