私は25msごとに起動するタイマーが必要です。私はドットネットコアランタイムと最新のモノランタイムの両方で、Windows 10とLinux(Ubuntu Server 16.10と12.04)の間のデフォルトTimer
の実装を比較してきました。C#タイマー解像度:Linux(モノ、ドットネットコア)vs Windows
タイマー精度には多少の違いがあります。
私はタイマーをテストするために次のコードを使用しています:Windows上
// inside Main()
var s = new Stopwatch();
var offsets = new List<long>();
const int interval = 25;
using (var t = new Timer((obj) =>
{
offsets.Add(s.ElapsedMilliseconds);
s.Restart();
}, null, 0, interval))
{
s.Start();
Thread.Sleep(5000);
}
foreach(var n in offsets)
{
Console.WriteLine(n);
}
Console.WriteLine(offsets.Average(n => Math.Abs(interval - n)));
それはあらゆる場所にあります:
...
36
25
36
26
36
5,8875 # <-- average timing error
Linux上DOTNETコアを使用して、それはすべての上に少ないのです場所:
...
25
30
27
28
27
2.59776536312849 # <-- average timing error
しかし、モノTimer
は非常に正確である:
...
25
25
24
25
25
25
0.33 # <-- average timing error
編集:でも、窓に、モノはまだそのタイミング精度を維持します。
...
25
25
25
25
25
25
25
24
0.31
この違いを引き起こしていますか?ドットネットのコアランタイムが、モノと比べて物事を行う方法に利点がありますか?失われた精度を正当化するものですか?
2017実際の解決策はまだありません。なぜ誰かが各プラットフォームでネイティブのC++マルチメディアタイマーをまとめないのですか?何か問題があるかどうかわからない? –
@ b.ben Windowsでは、Timerクラスのモノ実装をCLR(モノラルを使用せず)で使用することが実際に可能であると信じています。同じ精度が得られます。ここでの問題は単なるSTL実装です。 – Size43