使用ticks初始化Timespan时出现意外结果

时间:2016-06-24 04:30:20

标签: c# nunit timespan stopwatch system.diagnostics

我正在编写一个单元测试,它将通过一些功能来处理所有集合项的迭代计时。在单元测试中,我将SomeFunctionality设置为睡眠时间为100ms的函数。

public void SomeFunctionality(CollectionItem item)
{
    Thread.Sleep(100);
}

单元测试如下所示:

var stopwatch = new Stopwatch();
stopwatch.Start();
for(var item in collection)
{
    SomeFunctionality(item);
}
stopwatch.Stop();

其中collection是一个包含3个对象的列表。接下来,我得到totalElapsedTimeSpan,它表示迭代整个集合所花费的总时间(预期为~300ms)和averageTimeSpan,表示每个项目花费的平均时间(预计为~100)

var totalElapsedTimeSpan = stopwatch.Elapsed;
var averageTicksPerItem = GetAverageTicksPerCollectionItem(_stopwatch.ElapsedTicks, collectionCount);
var averageTimeSpan = new TimeSpan(averageTicksPerItem);

其中averageTicksPerItem的计算方法如下:

public long GetAverageTicksPerCollectionItem(long ticks, int count)
{
    return Convert.ToInt64(Math.Round(((double)ticks / count), MidpointRounding.AwayFromZero));
}

当然,输出并不是我们所期望的那样:

totalElapsedTimeSpan.TotalMilliseconds: 302.4239
averageTimeSpan.TotalMilliseconds: 25.5367

为了确保,我确认GetAverageTicksPerCollection函数调用并未导致意外更改。 GetAverageTicksPerCollectionItem的输入和输出是:

ticks: 774720
count: 3
averageTicksPerItem: 258240

所以检查出来。将averageTimeSpan传递给构造函数时,averageTicksPerItem的值是否显着低于预期的~100ms?

0 个答案:

没有答案