2012-06-11 25 views
1

我有一個C#程序,帶有一個處理部分列表的中斷,我希望每40毫秒運行一次,但中斷內部的數學運算可能會凍結具有特定大小和屬性的列表。與普通算術相比,TImeSpan算法耗時多少?

我很想嘗試通過刪除TimeSpan來加減數學運算並將它們全部轉換爲TotalMilliseconds,然後再執行算術運算而不是之後進行加速。有誰知道增加和減少TimeSpans的開銷是什麼,而不是增加和減少TotalMilliseconds?

謝謝。

+3

引擎蓋下的所有東西都已經包含「嘀嗒」(例如,'long result = _ticks + ts._ticks')。隨着抖動內聯,我懷疑你會看到很多改進。 –

+0

在編寫這個問題的時間裏,你不可能創建一個測試項目來衡量這兩種方法在幾百萬次迭代中的情況嗎? :) –

+0

您可以使用.NET Reflector查看.NET DLL並找出發生了什麼。 – kol

回答

11

這將是不明智的,Timespan.TotalMilliseconds是類型的屬性,單位爲1毫秒。這與底層結構值高度無關,Ticks是的基礎字段的屬性獲取器,單位爲100納秒。 TotalMilliseconds屬性獲得者通過一些體操將長轉換爲雙重,它確保來回轉換產生相同的數字。

對於TimeSpan來說,這是一個問題,它可以覆蓋10,000年,精度爲100納秒。然而,雙倍有15位有效數字,這不足以涵蓋那麼多年的精確度。 TotalMilliseconds屬性執行舍入,而不僅僅是轉換,它確保返回的值精確到1毫秒。不是100納秒。所以來回轉換始終會產生相同的值。

確實有效:10,000年x 365.4天x 24小時x 60分鐘x 60秒x 1000毫秒= 315,705,600,000,000毫秒。對數字進行計數,精確到15,這樣就可以存儲在雙精度上,而不會降低精度。幸福的巧合,不是嗎?

回答這個問題:如果你關心速度,那麼總是使用Ticks,而不是TotalMilliseconds。這是一個非常快速的64位整數操作。 方式快於整數到浮點+舍入轉換。

+1

先期成熟的優化是萬惡之源。這些低級別的調整幾乎不能提高性能 - 即使在最複雜的算法交易系統中也是如此。 –

+0

哇,我假設它使用了整數或無符號整數,當它做了毫秒數。 – Rorrik

+0

@MonsterTruck你是對的,我只是不得不重新考慮如何限制迭代列表的哪一部分,並將其時間縮短了80倍。 – Rorrik