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

EugenOS

Active member
22.07.2007
27
0
#1
Добрый день всем.
Имею такую проблему. Для мониторинга времени работы операций добавил в свою программу опцию измерения времени опрераций:
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 из кернела импортировать...но опять же там, емнип (пойду посмотрю точно), тоже милисекунды...Вопрос что делать????
 

EugenOS

Active member
22.07.2007
27
0
#2
Я соврал, к стати, не 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.
 

a0z

Well-known member
15.03.2011
108
0
#3
Используй Stopwatch. У меня даёт точность до тика.