Stopwatch类中的Elapsed.Ticks与ElapsedTicks的区别
-
2012年5月4日 5:36
今天我写测试代码的时候在网上发现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
的区别 ,究竟我应该使用哪一个?
全部回复
-
2012年5月4日 5:48
-
2012年5月4日 5:49
我看到一篇帖子,说不能使用精度太高
正常..你用的是刻度精确度太高..本身迭代,进入委托都使需要时间的
所以你用大数据量才能测试出来,差个几毫秒
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;
} -
2012年5月4日 8:37
-
2012年5月4日 8:38
Elapsed和ElapsedMilliseconds属性在被调用时,会在内部调用kernel32中的QueryPerformanceFrequency()函数以获取处理器支持的高精度计时器的频率,随后用这个数字对获取的时间差值进行修正,最后Elapsed属性会返回一个新的TimeSpan对象。
而获取ElapsedTicks属性时则不会进行这种高精度的计算(修正)。
但是一般来说这两者的误差并不是很大。如果需要精确计算时间或是测试数据量特别大的情况下,推荐使用Elapsed和ElapsedMilliseconds属性。
共同努力,共同提高
kaedei#live.cn My BLOG -
2012年5月4日 11:47
你的意思是是说用 StopWatch.Elapsed.Ticks 就可以了是吧?
我这里的计算时间结果是这样的
DbBackUp函数(COM): Elapsed.Ticks:2808128
ElapsedTicks:5471076
DataBaseBackup函数(SQL): Elapsed.Ticks:9758651
ElapsedTicks:1901278
-
2012年5月4日 12:06
-
2012年5月8日 9:57
你好,
从内部实现来看,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日 10:06
-
2012年5月8日 12:12
个人觉得都能用啊,就看是不是StopWatch.IsHighresolution = true了。
你这里的两个函数为什么会出现这种情况蛮奇怪的,我这儿测试下来没这样的问题诶。
Michael Sun [MSFT]
MSDN Community Support | Feedback to us
- 已标记为答案 桦仔 2012年5月8日 12:41
-
2012年5月8日 12:41
-
2012年5月9日 4:38
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日 6:47
-
2012年5月9日 6:47
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); }的确好方法


