Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
秒表和0毫秒通过c#_C#_Stopwatch - Fatal编程技术网

秒表和0毫秒通过c#

秒表和0毫秒通过c#,c#,stopwatch,C#,Stopwatch,我尝试计算两次操作之间的时间。 因此,用相同的代码编写两个方法,但使用不同的方法。 首先,我喜欢这样: private static void calcAverageTimeUid(ISomeObject someObj, int N,ISnapshot _Snapshot) { Stopwatch stopWatch = new Stopwatch(); int averageTime = 0; var uid = someObj.Uid

我尝试计算两次操作之间的时间。 因此,用相同的代码编写两个方法,但使用不同的方法。 首先,我喜欢这样:

private static void calcAverageTimeUid(ISomeObject someObj, int N,ISnapshot _Snapshot)
    {
        Stopwatch stopWatch = new Stopwatch();
        int averageTime = 0;
        var uid = someObj.Uid;

        for (int i = 0; i < N; i++)
        {
            stopWatch.Start();
            var coll = _Snapshot.GetObject(uid);
            stopWatch.Stop();
            TimeSpan ts = stopWatch.Elapsed;
            averageTime = averageTime + ts.Milliseconds;
        }
        averageTime = averageTime / N;

    }
所以,我在这个方法中运行mainCalc和calcAcerageTimeUid2。秒表的结果=0毫秒

结果是否错误?我不明白用秒表的方法对吗

请删除多余的秒表之一


谢谢大家

你的第一个常规应该是

    for (int i = 0; i < N; i++)
    {
        stopWatch.Start();
        var coll = _Snapshot.GetObject(uid);
        stopWatch.Stop();
    }
    averageTime = stopWatch.Elapsed / N;
for(int i=0;i

注意,
stopWatch.Start()
不会将秒表重置为零。

您的第一个例程应该是

    for (int i = 0; i < N; i++)
    {
        stopWatch.Start();
        var coll = _Snapshot.GetObject(uid);
        stopWatch.Stop();
    }
    averageTime = stopWatch.Elapsed / N;
for(int i=0;i

请注意,
stopWatch.Start()
不会将秒表重置为零。

得到不同结果的原因是您在不同的位置舍入毫秒数。在第一种方法中,您使用一个秒表并连续地
Start()
Stop()
。您的操作所需时间必须少于1毫秒,但当您重复启动和停止同一秒表时,滴答声的总数仍将增加。这就是为什么N=1000000时,只有500毫秒

在第二种方法中,每次启动和停止一个新的秒表,并返回毫秒数。由于每次操作的平均值为500/1000000=0.00005 ms,秒表的滴答声将累积一些较小的值,但时间跨度的
elapsedmillyses
(或
毫秒
)仍将为0

编辑:为了解决您的问题,第一个循环应在循环完成后使用秒表的最终<代码>经过时间值(如Sgmore回答中的第二个示例)。第二个方法应该返回该方法的滴答声,而不是毫秒,然后根据秒表的滴答声频率计算毫秒


总之,第一个操作是对一组值(如0.00005)求和,第二个操作是对一组0求和。

得到不同结果的原因是,在不同的位置对毫秒数进行舍入。在第一种方法中,您使用一个秒表并连续地
Start()
Stop()
。您的操作所需时间必须少于1毫秒,但当您重复启动和停止同一秒表时,滴答声的总数仍将增加。这就是为什么N=1000000时,只有500毫秒

在第二种方法中,每次启动和停止一个新的秒表,并返回毫秒数。由于每次操作的平均值为500/1000000=0.00005 ms,秒表的滴答声将累积一些较小的值,但时间跨度的
elapsedmillyses
(或
毫秒
)仍将为0

编辑:为了解决您的问题,第一个循环应在循环完成后使用秒表的最终<代码>经过时间值(如Sgmore回答中的第二个示例)。第二个方法应该返回该方法的滴答声,而不是毫秒,然后根据秒表的滴答声频率计算毫秒

总之,第一个操作是对一组值求和,比如0.00005,第二个操作是对一组0求和。

不是

毫秒是时间跨度的整毫秒数。不是两倍的总毫秒数,因此在1ms以下将失去精度

为什么返回的是
int
,而不是
TimeSpan

请尝试以下代码:

private static void mainCalc(ISomeObject someObj, int N, ISnapshot _Snapshot)
{
    var averageTimeUID = TimeSpan.Zero;
    for (int i = 0; i < N; i++)
    {
        averageTimeUID += calcAverageTimeUid2(someObj,N,_Snapshot);
    }
    averageTimeUID = new TimeSpan( averageTimeUID.Ticks / N );
}
事实并非如此

毫秒是时间跨度的整毫秒数。不是两倍的总毫秒数,因此在1ms以下将失去精度

为什么返回的是
int
,而不是
TimeSpan

请尝试以下代码:

private static void mainCalc(ISomeObject someObj, int N, ISnapshot _Snapshot)
{
    var averageTimeUID = TimeSpan.Zero;
    for (int i = 0; i < N; i++)
    {
        averageTimeUID += calcAverageTimeUid2(someObj,N,_Snapshot);
    }
    averageTimeUID = new TimeSpan( averageTimeUID.Ticks / N );
}

你不能用那种方法启动秒表。。(提示:中间的一个)。我不太明白你的意思,但是如果你想让秒表显示每次操作的时间量,你应该重新启动或重置秒表。@SimonWhitehead:他正在
calcAverageTimeUid2
中使用秒表并返回结果。MainCalc正在总结总时间。啊,是的,我现在看到了!愚蠢的我:)第一个片段有一个错误,它不会重置秒表。第二个代码段是正确的,但是当计时操作花费的时间少于一毫秒时,它会使用毫秒。您没有在这些方法中启动秒表。。(提示:中间的一个)。我不太明白你的意思,但是如果你想让秒表显示每次操作的时间量,你应该重新启动或重置秒表。@SimonWhitehead:他正在
calcAverageTimeUid2
中使用秒表并返回结果。MainCalc正在总结总时间。啊,是的,我现在看到了!愚蠢的我:)第一个片段有一个错误,它不会重置秒表。第二个代码段正确地实现了这一点,但当计时操作所需时间少于一毫秒时,它会使用毫秒。第一个代码段不会给出有意义的结果,因为操作所需时间少于一毫秒。第二个是实数。第一个不会给出有意义的结果,因为运算时间小于一毫秒。第二个是实心的。可能averageTimeUID=newTimeSpan(averageTimeUID.Ticks/N)@user2545071:你是对的,TimeSpan的构造函数采用滴答而不是毫秒,我已经进行了编辑。可能averageTimeUID=new TimeSpan(averageTimeUID.Ticks/N)@user2545071:你是对的,TimeSpan的构造函数采用滴答而不是毫秒,我已经进行了编辑。
private static TimeSpan calcAverageTimeUid2(ISomeObject someObj, int N, ISnapshot _Snapshot)
{ 
    var stopWatch = new Stopwatch();
    var prop = someObj.Uid;
    stopWatch.Start();
    var obj = _Snapshot.GetObject(prop);
    stopWatch.Stop();
    return stopWatch.Elapsed;
}