2012-07-18 744 views
3

你好,再次問我是否可以使用C#中的TimesSpan打印microsencods。TimeSpan轉換爲微秒?

我有下面的例子:

DateTime startTime = DateTime.Now; 
..../some code 
DateTime endTime = DateTime.Now; 
TimeSpan totalTimeTaken = endTime.Subtract(startTime); 
Label3.Text=(totalTimeTaken.Milliseconds).ToString(); 

這段代碼可以讓我以毫秒爲單位顯示,但我需要顯示微秒有沒有辦法將其更改爲微秒或做我必須用別的東西嗎?

必須編輯我的問題: 我的目標是測量2 DateTime之間花費的時間,因爲它只有幾行毫秒就不會削減它,這就是我需要微秒的原因。

+1

TimeSpan不支持該粒度。 – 2012-07-18 18:13:34

+3

@PeterRitchie'本身TimeSpan'不支持這一粒度 - 這是一個簡單的小結構蜱顆粒狀到微秒的十分之一。問題在於'DateTime':它的粒度更差。 – dasblinkenlight 2012-07-18 18:35:38

+0

如果你的'TimeSpan'是,比方說,'00:00:02.3456789',在'Milliseconds'屬性只會給你部分'345',作爲'Int32'('int')。你想要的是'TotalMilliseconds'。這是一個'雙',並將包括所有的數字。看到我的答案。 – 2012-07-18 19:49:36

回答

5

您會發現最高分辨率將通過Stopwatch class。如果您的CPU支持高分辨率計時器,則Stopwatch類將使用它。您可以通過IsHighResolution和/或Frequency屬性進行檢查。

這是你應該使用性能測量,不DateTime類。

編輯:我剛剛學到新的東西有關日期時間。從the docs ...

時間值在稱爲蜱100納秒單位測量,並且一個特定的日期是蜱的數目,因爲午夜12:00,1月1日,0001 AD(CE)在GregorianCalendar的日曆(不包括將以閏秒添加的蜱)。例如,31241376000000000L的刻度值代表01月01日星期五午夜12點00分00:00的日期。 DateTime值總是在顯式或默認日曆的上下文中表達。

然而,分辨率的DateTime.Now仍約15毫秒,所以它不會工作(這使得文檔充其量誤導......)使用秒錶。

+0

任何人都在關注downvotes?這裏有什麼不正確? – 2012-07-18 18:40:02

+0

嗯,看起來我早點擊中了,而不是意外。抱歉>< – asawyer 2012-07-18 18:43:59

+0

閱讀你的anwsers並嘗試所有示例後,它看起來像我現在要使用秒錶來調查它的工作原理,謝謝所有 – JUAN 2012-07-18 18:50:51

1

使用System.Diagnostics.Stopwatch如果你需要一個高水平的精度。

從代碼示例,如果長得像你想的東西的時間。 DateTime是一個糟糕的結構。請參閱Eric Lippert的文章"Precision and Accuracy of DateTime"瞭解更多信息。現在

的問題,「多少時間已經從開始起完嗎?」是 不是「現在是什麼時候,現在?」如果 你要問的問題是如何長一個完全不同的問題一些操作花了, ,你想要一個高精度,高精度的答案,然後使用秒錶類 。它確實具有接近其精確度的納秒級精度和準確度 。

+0

在有些情況下秒錶簡單地使用DateTime.UtcNow.Ticks情況... – 2012-07-18 18:51:03

+0

@PeterRitchie這很有趣。那些情況是什麼? – asawyer 2012-07-18 18:53:28

+0

@PeterRitchie:文檔說如果可用,它將使用CPU的高性能計數器。它不可用(很少這些天),那麼你沒有選擇無論如何。 – 2012-07-18 18:54:38

1

您可以使用DateTime類。 DateTime有一個名爲Ticks的屬性。

DateTime.Ticks

從鏈接:

「一個單一的刻度表示一個幾百納秒或第二的千萬分之一有10000個蜱毫秒。

該屬性的值表示自午夜12:00:00,0001年1月1,其表示DateTime.MinValue時起已經過的100毫微秒的時間間隔的數目。它不包括那些由於閏秒的刻度數「

DateTime dt1 = DateTime.Now; 
// do stuff here... 
DateTime dt2 = DateTime.Now; 

long nanoseconds = (dt2.Ticks - dt1.Ticks) * 100; 
+0

這不行; DateTime.Now不使用高性能計時器(如果可用),所以分辨率仍然很低。 – 2012-07-18 18:49:02

+0

雅謝謝,我注意到在我的編輯評論。 – James 2012-07-18 18:51:48

+0

這是可以理解的;該文件是誤導性的。 – 2012-07-18 18:52:46

0

其他人編寫好的事情上的精度,當你減去兩個DateTime.Now,你可以期望,還有另外重要的一點:。用totalTimeTaken.TotalMilliseconds。不totalTimeTaken.Milliseconds總體數量將有4位小數

要得到微秒,只需使用1000.0 * totalTimeTaken.TotalMilliseconds有一般將小數點後一位小數,但重複:不是所有的這些數字將與典型可靠硬件和實現。