• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Datetime.now.ticks - нафига такая точность, если обновляется он раз в секунду?

  • Автор темы EugenOS
  • Дата начала
E

EugenOS

Добрый день всем.
Имею такую проблему. Для мониторинга времени работы операций добавил в свою программу опцию измерения времени опрераций:
C++:
#if timelog
		private System.DateTime timerStart;
		String timelog_path;
		private void timeStart() { timerStart = System.DateTime.Now; }
		private void timeInit()
		{			 
			timelog_path = Application.StartupPath + "\\timelog";
			System.IO.File.WriteAllText( timelog_path + "\\timelog.txt", Environment.NewLine );
		}
		private void timeLog(String hdr)
		{
			System.DateTime timerEnd = System.DateTime.Now;
			TimeSpan ts = timerEnd.Subtract(timerStart);
			System.IO.File.AppendAllText( timelog_path + "\\timelog.txt", Environment.NewLine + hdr + " " + ts.Milliseconds + "ms. " + ts.Ticks + " ticks. [" 
				 + timerStart.Millisecond + ":" + timerStart.Ticks + "..."+ timerEnd.Millisecond + ":" + timerEnd.Ticks + "]");
		}
#endif
использую следующим образом (например хочу знать время получения массива сортированных ключей
из SortedDictionary):
C++:
#if timelog
			timeStart();
#endif
			ICollection<UInt64> keys = checks.Keys;
#if timelog
			timeLog( "527:: ICollection<UInt64> keys = checks.Keys;" );
#endif
учитывая, что в данном случае создается и копируется массив, время будет всяко больше 10 наносекунд. Но я имею около 10 таковых операций с результатом времени 0, и одну со временем 1001 с хвостиком миллисекунда. Т.е. на лицо обновление DataTime.Now раз в секунду. Спрашивается - нафига такая высокая точность, если время обновляется так редко?
Может какие опции есть системные?
Пока попробую воспользоваться Environment.Ticks (но тут только миллисекунды) ну или еще может GetTickCount из кернела импортировать...но опять же там, емнип (пойду посмотрю точно), тоже милисекунды...Вопрос что делать????
 
E

EugenOS

Я соврал, к стати, не 1001 миллисекунд, а 1001 тиков. Но все равно, - не верю что эта операция занимает менее 10 наносекунд. Элементов-то больше тысячи.
Вот кусок "тайм-лога" программы:
Код:
527:: ICollection<UInt64> keys = checks.Keys; 0ms. 0 ticks. [993:635722235399934216...993:635722235399934216]
549-557:: if( key >> 16  != baseFileIdx ){...} 0ms. 0 ticks. [125:635722235401254291...125:635722235401254291]
549-557:: if( key >> 16  != baseFileIdx ){...} 0ms. 0 ticks. [326:635722235403264406...326:635722235403264406]
549-557:: if( key >> 16  != baseFileIdx ){...} 0ms. 0 ticks. [483:635722235404834496...483:635722235404834496]
549-557:: if( key >> 16  != baseFileIdx ){...} 0ms. 0 ticks. [626:635722235406264578...626:635722235406264578]
549-557:: if( key >> 16  != baseFileIdx ){...} 0ms. 0 ticks. [757:635722235407574653...757:635722235407574653]
549-557:: if( key >> 16  != baseFileIdx ){...} 0ms. 0 ticks. [878:635722235408784722...878:635722235408784722]
549-557:: if( key >> 16  != baseFileIdx ){...} 0ms. 0 ticks. [30:635722235410304809...30:635722235410304809]
549-557:: if( key >> 16  != baseFileIdx ){...} 0ms. 0 ticks. [154:635722235411544880...154:635722235411544880]
549-557:: if( key >> 16  != baseFileIdx ){...} 1ms. 10001 ticks. [343:635722235413434988...344:635722235413444989]

Все по ноль и вдруг один сразу 1001.
 
A

a0z

Используй Stopwatch. У меня даёт точность до тика.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!