none
Stopwatch类中的Elapsed.Ticks与ElapsedTicks的区别 RRS feed

  • 问题

  • 今天我写测试代码的时候在网上发现Stopwatch类有两个测试的方法

    Stopwatch timer = new Stopwatch();
    
     #region 开始计时
     timer.Start();
    bool st = this.DbBackUp(sfd.FileName,this.cmbDatabases.Text.Trim());
    //bool st = this.DataBaseBackup(sfd.FileName,this.cmbDatabases.Text.Trim());
                            System.Windows.Forms.Cursor.Current = Cursors.Default;
     timer.Stop();
     #endregion
    
    string Elapsed = timer.Elapsed.Ticks.ToString();
    string ElapsedMilliseconds = timer.ElapsedMilliseconds.ToString();
    string ElapsedTicks = timer.ElapsedTicks.ToString();

    请问 

    timer.Elapsed.Ticks

     timer.ElapsedTicks

    的区别 ,究竟我应该使用哪一个?


    给我写信: QQ我:点击这里给我发消息

    2012年5月4日 5:36

答案

  • 个人觉得都能用啊,就看是不是StopWatch.IsHighresolution = true了。

    你这里的两个函数为什么会出现这种情况蛮奇怪的,我这儿测试下来没这样的问题诶。


    Michael Sun [MSFT]
    MSDN Community Support | Feedback to us

    2012年5月8日 12:12
  • dear

    小的路过,建议下,量测时间可用单元测试就好,不需另外再写code,请参考

    http://www.dotblogs.com.tw/wadehuang36/archive/2010/09/09/testduration.aspx

    如果硬是要写code,量测时间的代码也不应该发布到客户端所以你会有debug跟release版本,debug版友量测时间,发布到客户端的release版本没有,debug与release都应该要同时维护,你可使用#if debug 或 [Conditional("DEBUG")],请参考

    http://www.dotblogs.com.tw/yc421206/archive/2011/06/09/27597.aspx


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    2012年5月9日 4:38

全部回复

  • 还是使用timer.ElapsedMilliseconds ?

    给我写信: QQ我:点击这里给我发消息

    2012年5月4日 5:48
  • 我看到一篇帖子,说不能使用精度太高

    正常..你用的是刻度精确度太高..本身迭代,进入委托都使需要时间的
    所以你用大数据量才能测试出来,差个几毫秒
    static void Main(string[] args)
    {
    Stopwatch watch = new Stopwatch();
    Random rand = new Random();
    List<int> list = new List<int>(); //构造一个LIST 
    for (int i = 0; i < 1000000; i++) { list.Add(rand.Next(10)); }
    //用FindAll 
    watch.Start();
    List<int> resultFindAll=list.FindAll(test);
    watch.Stop();
    Console.WriteLine("FindAll:" + watch.ElapsedMilliseconds);
    Console.WriteLine("resultFindAll:" + resultFindAll.Count); //用For循环 
    watch.Reset(); 
    watch.Start();
    List<int> resultFor = new List<int>();
    for (int i = 0; i < list.Count; i++) 

    if (list[i] == 5) 

    resultFor.Add(list[i]); 


    watch.Stop(); 
    Console.WriteLine("For:"+watch.ElapsedMilliseconds); 
    Console.WriteLine("resultFor:" + resultFor.Count); 

    }
    static bool test(int i)
    {
    return i == 5;
    }


    给我写信: QQ我:点击这里给我发消息

    2012年5月4日 5:49
  • Elapsed和ElapsedMilliseconds属性在被调用时,会在内部调用kernel32中的QueryPerformanceFrequency()函数以获取处理器支持的高精度计时器的频率,随后用这个数字对获取的时间差值进行修正,最后Elapsed属性会返回一个新的TimeSpan对象。

    而获取ElapsedTicks属性时则不会进行这种高精度的计算(修正)。

    但是一般来说这两者的误差并不是很大。如果需要精确计算时间或是测试数据量特别大的情况下,推荐使用Elapsed和ElapsedMilliseconds属性。


    共同努力,共同提高
    kaedei#live.cn My BLOG

    2012年5月4日 8:38
  • 你的意思是是说用  StopWatch.Elapsed.Ticks  就可以了是吧?

    我这里的计算时间结果是这样的


                
    DbBackUp函数(COM):                        Elapsed.Ticks:2808128
                                                                  ElapsedTicks:5471076


     DataBaseBackup函数(SQL):            Elapsed.Ticks:9758651
                                                                 ElapsedTicks:1901278


    给我写信: QQ我:点击这里给我发消息



    2012年5月4日 11:47
  • 修改一下,请问为什麽毫秒数那里databasebackup函数比dbbackup函数快,但是Elapsed.tick那里  databasebackup函数比dbbackup函数慢:

          

    DbBackUp函数(COM):                    Elapsed.Ticks:2808128
                                                              ElapsedTicks:5471076
                                                             ElapsedMilliseconds:3011毫秒


     DataBaseBackup函数(SQL):            Elapsed.Ticks:9758651
                                                                 ElapsedTicks:1901278
                                                              ElapsedMilliseconds:829毫秒


    给我写信: QQ我:点击这里给我发消息

    2012年5月4日 12:06
  • 你好,

    从内部实现来看,StopWatch.IsHighresolution = true时,StopWatch.Elapsed.Ticks应该等于StopWatch.ElapsedTicks再乘以frequency(频率的常量)。反之,这2个数在IsRunning为true时,应该是相等的。

    所以照理应该是StopWatch.Elapsed.Ticks会比较大... 你代码里DbBackUp函数的情况有点怪。


    Michael Sun [MSFT]
    MSDN Community Support | Feedback to us

    2012年5月8日 9:57
  • 那我应该使用哪个呢?

     Elapsed.Ticks?
    ElapsedTicks?

    还有为什麽毫秒数那里databasebackup函数比dbbackup函数快,但是Elapsed.tick那里 databasebackup函数比dbbackup函数慢?

    这个问题怎麽解释呢?


    给我写信: QQ我:点击这里给我发消息

    2012年5月8日 10:06
  • 个人觉得都能用啊,就看是不是StopWatch.IsHighresolution = true了。

    你这里的两个函数为什么会出现这种情况蛮奇怪的,我这儿测试下来没这样的问题诶。


    Michael Sun [MSFT]
    MSDN Community Support | Feedback to us

    2012年5月8日 12:12
  • 我也不清楚,

    那我以后这样用:

    如果需要时间就使用:Elapsed.Ticks

    需要时间就使用: ElapsedMilliseconds(单位毫秒)


    给我写信: QQ我:点击这里给我发消息

    2012年5月8日 12:41
  • dear

    小的路过,建议下,量测时间可用单元测试就好,不需另外再写code,请参考

    http://www.dotblogs.com.tw/wadehuang36/archive/2010/09/09/testduration.aspx

    如果硬是要写code,量测时间的代码也不应该发布到客户端所以你会有debug跟release版本,debug版友量测时间,发布到客户端的release版本没有,debug与release都应该要同时维护,你可使用#if debug 或 [Conditional("DEBUG")],请参考

    http://www.dotblogs.com.tw/yc421206/archive/2011/06/09/27597.aspx


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    2012年5月9日 4:38
  • static Stopwatch _sw = new Stopwatch();
    static void Main(string[] args)
    {
        StartLog();
        long num = 0;
        for (int i = 1; i < 100000000; i++)
        {
            num += 1;
        }
        StopLog();
        Console.ReadLine();
    }
    
    [Conditional("DEBUG")]
    static void StartLog()
    {
        _sw.Reset();
        _sw = Stopwatch.StartNew();
    }
    [Conditional("DEBUG")]
    static void StopLog()
    {
        _sw.Stop();
        TimeSpan el = _sw.Elapsed;
        Console.WriteLine("花費 {0} ", el);
    
        long ms = _sw.ElapsedMilliseconds;
        Console.WriteLine("花費 {0} 毫秒", ms);
    
        long tk = _sw.ElapsedTicks;
        Console.WriteLine("花費 {0} ticks", tk);
    }
     的确好方法

    给我写信: QQ我:点击这里给我发消息

    2012年5月9日 6:47
  • 

    从内部实现来看,StopWatch.IsHighresolution = true时,StopWatch.Elapsed.Ticks应该等于StopWatch.ElapsedTicks再乘以frequency(频率的常量)。反之,这2个数在IsRunning为true时,应该是相等的。

     这是我循环输入1到10000的结果:

    Stopwatch.IsHighResolution True
    循环次数:10000 CPU时间(毫秒):=0 实际时间(毫秒):=11263.9629
    1 tick = 0.0001毫秒
    stw.Elapsed 00:00:11.2639629
    stw.Elapsed.TotalMilliseconds 11263.9629
    stw.ElapsedMilliseconds 11263
    stw.Elapsed.Ticks 112639629
    stw.ElapsedTicks 31827679
    Stopwatch.Frequency 2825620
    stw.ElapsedTicks * Stopwatch.Frequency  89932926335980

    为什么和你说的差这么大呢?谢谢。

    2013年11月15日 3:21