C#中Stopwatch和DateTime中的ticks的异同
2个回答
展开全部
近期在看C#中的stopwatch的使用方法,然后结合DateTime发现了一个有趣的事情,主要是关于ticks的差异。我们首先来看一个简单的代码:
static void StopTimeTest()
{
Stopwatch sw = new Stopwatch();
//开始计时
sw.Start();
//100ms
Thread.Sleep(100);
//计时结束
sw.Stop();
Console.WriteLine("elpase time {0}, elapse ticks {1}", sw.ElapsedMilliseconds, sw.ElapsedTicks);
}
static void Main(string[] args)
{
StopTimeTest();
}
这段代码很简单,就是通过StopWatch来检测一个执行过程消耗的时间,这个在研究performance的log中有重要的作用。
这段函数的输出如下:
可以简单的看出elapse time输出的就是100ms,这个没有什么问题。但是后面的这个ticks是什么东西,他是如何算出来的。我们去MSDN上看看,他是如何解释这个这个ticks的:
This property represents the number of elapsed ticks in the
underlying timer mechanism. A tick is the smallest unit of time that the
Stopwatch timer can measure. Use the Frequency field to convert the ElapsedTicks value into a number of seconds.
From < https://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.elapsedticks(v=vs.110).aspx >
这段话很简单,我就不翻译了,但是很显然,这个elapseTicks的值是和frequency相关的,他可以通过frequency来计算出具体的时间。好吧,我们在原来的打印语句下面加上下面这个打印,看看frequency是什么情况:
//注意Frequency是Stopwatch,不是具体的sw
Console.WriteLine("Stopwatch freq:{0}, elapse time:{1}ns", Stopwatch.Frequency, sw.ElapsedTicks*(1000L * 1000L * 1000L) / Stopwatch.Frequency);
输出如下:
针对frequency,MSDN有如下的解释:
Because the Stopwatch
frequency depends on the installed hardware and operating system,
the Frequency value remains constant while the system is running.
From < https://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.frequency(v=vs.110).aspx >
可以看出,虽然frequency在不同的设备上其值是不同的,但是在同一个设备上他的值得固定的。而时间其实就是通过elapsedTicks/Frequency可以得到。
到了这里我们先把stopwatch放一放,然后来看一下DateTime,同样看一段很简单的代码:
static void DateTimeTest()
{
//打印时的时间格式
string DATE_FORMAT = "yyyy-MM-dd HH:mm:ss.ffff";
//开始的utc time
DateTime startTime = DateTime.UtcNow;
Thread.Sleep(200);
//结束的utc time
DateTime endTime = DateTime.UtcNow;
Console.WriteLine("start time:{0}, end time:{1}", startTime.ToString(DATE_FORMAT, CultureInfo.InvariantCulture), endTime.ToString(DATE_FORMAT, CultureInfo.InvariantCulture));
}
这段函数其实也很简单,就是打印一个起始的时间和一个结束的时间,输出的结果如下:
很清晰,结果也是200ms左右。在一些log系统中有人想要起始的时间点,又想知道中间的监听的elpase
time,所以就想把DateTime和StopWatch结合起来运用。正好看到DateTime中有一个AddTicks的方法,于是就有了下面这段
代码的出现:
static void StopAndDateTimeTest()
{
Stopwatch sw = new Stopwatch();
string DATE_FORMAT = "yyyy-MM-dd HH:mm:ss.ffff";
//起始时间
DateTime startTime = DateTime.UtcNow;
//开始计时
sw.Start();
//300ms
Thread.Sleep(300);
//计时结束
sw.Stop();
//得到结束的时间
DateTime endTime = startTime.AddTicks(sw.ElapsedTicks);
Console.WriteLine("elpase time {0}", sw.ElapsedMilliseconds);
Console.WriteLine("start time:{0}, end time:{1}", startTime.ToString(DATE_FORMAT, CultureInfo.InvariantCulture), endTime.ToString(DATE_FORMAT, CultureInfo.InvariantCulture));
}
这段代码的目的也很清晰,就是向DateTime的AddTicks方法传入StopTime的ElapsedTicks来计算endTime。看起来还是蛮完美的,我们来看一下执行的结果:
End Time的值并不是我们期望的start time加上300ms,也就是说这样计算end time是错误的,这究竟是为什么呢?我们从MSDN上找到了答案:
Stopwatch ticks are different from DateTime.Ticks . Each tick in the DateTime.Ticks
value represents one 100-nanosecond interval. Each tick in
theElapsedTicks value represents the time interval equal to 1 second
divided by the Frequency .
From < https://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.elapsedticks(v=vs.110).aspx >
简单来说,就是Stopwatch的tick和DateTime的ticks是不同的概念,DateTime中的tick的值是100ns为一
个tick,而stopwatch中的elapsedTicks所表示的tick的值则是1/Frequency,两者是不同的。那么是不是说我们就没有
办法通过ticks来把两者联系起来了呢,不然,请看下面代码:
static void StopAndDateTimeTest()
{
Stopwatch sw = new Stopwatch();
string DATE_FORMAT = "yyyy-MM-dd HH:mm:ss.ffff";
//起始时间
DateTime startTime = DateTime.UtcNow;
//开始计时
sw.Start();
//300ms
Thread.Sleep(300);
//计时结束
sw.Stop();
//得到结束的时间
//DateTime endTime = startTime.AddTicks(sw.ElapsedTicks);
//这里把ElapsedTicks改成Elapsed.Ticks,注意中间多了一个点
DateTime endTime = startTime.AddTicks(sw.Elapsed.Ticks);
Console.WriteLine("elpase time {0}", sw.ElapsedMilliseconds);
Console.WriteLine("start time:{0}, end time:{1}", startTime.ToString(DATE_FORMAT, CultureInfo.InvariantCulture), endTime.ToString(DATE_FORMAT, CultureInfo.InvariantCulture));
}
执行的结果如下:
可以看到这就是我们想要的结果,所以Stoptime的elapsed的Ticks也是以100ns为单位的。若是想要和DateTime配合,需要使用这个ticks。
static void StopTimeTest()
{
Stopwatch sw = new Stopwatch();
//开始计时
sw.Start();
//100ms
Thread.Sleep(100);
//计时结束
sw.Stop();
Console.WriteLine("elpase time {0}, elapse ticks {1}", sw.ElapsedMilliseconds, sw.ElapsedTicks);
}
static void Main(string[] args)
{
StopTimeTest();
}
这段代码很简单,就是通过StopWatch来检测一个执行过程消耗的时间,这个在研究performance的log中有重要的作用。
这段函数的输出如下:
可以简单的看出elapse time输出的就是100ms,这个没有什么问题。但是后面的这个ticks是什么东西,他是如何算出来的。我们去MSDN上看看,他是如何解释这个这个ticks的:
This property represents the number of elapsed ticks in the
underlying timer mechanism. A tick is the smallest unit of time that the
Stopwatch timer can measure. Use the Frequency field to convert the ElapsedTicks value into a number of seconds.
From < https://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.elapsedticks(v=vs.110).aspx >
这段话很简单,我就不翻译了,但是很显然,这个elapseTicks的值是和frequency相关的,他可以通过frequency来计算出具体的时间。好吧,我们在原来的打印语句下面加上下面这个打印,看看frequency是什么情况:
//注意Frequency是Stopwatch,不是具体的sw
Console.WriteLine("Stopwatch freq:{0}, elapse time:{1}ns", Stopwatch.Frequency, sw.ElapsedTicks*(1000L * 1000L * 1000L) / Stopwatch.Frequency);
输出如下:
针对frequency,MSDN有如下的解释:
Because the Stopwatch
frequency depends on the installed hardware and operating system,
the Frequency value remains constant while the system is running.
From < https://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.frequency(v=vs.110).aspx >
可以看出,虽然frequency在不同的设备上其值是不同的,但是在同一个设备上他的值得固定的。而时间其实就是通过elapsedTicks/Frequency可以得到。
到了这里我们先把stopwatch放一放,然后来看一下DateTime,同样看一段很简单的代码:
static void DateTimeTest()
{
//打印时的时间格式
string DATE_FORMAT = "yyyy-MM-dd HH:mm:ss.ffff";
//开始的utc time
DateTime startTime = DateTime.UtcNow;
Thread.Sleep(200);
//结束的utc time
DateTime endTime = DateTime.UtcNow;
Console.WriteLine("start time:{0}, end time:{1}", startTime.ToString(DATE_FORMAT, CultureInfo.InvariantCulture), endTime.ToString(DATE_FORMAT, CultureInfo.InvariantCulture));
}
这段函数其实也很简单,就是打印一个起始的时间和一个结束的时间,输出的结果如下:
很清晰,结果也是200ms左右。在一些log系统中有人想要起始的时间点,又想知道中间的监听的elpase
time,所以就想把DateTime和StopWatch结合起来运用。正好看到DateTime中有一个AddTicks的方法,于是就有了下面这段
代码的出现:
static void StopAndDateTimeTest()
{
Stopwatch sw = new Stopwatch();
string DATE_FORMAT = "yyyy-MM-dd HH:mm:ss.ffff";
//起始时间
DateTime startTime = DateTime.UtcNow;
//开始计时
sw.Start();
//300ms
Thread.Sleep(300);
//计时结束
sw.Stop();
//得到结束的时间
DateTime endTime = startTime.AddTicks(sw.ElapsedTicks);
Console.WriteLine("elpase time {0}", sw.ElapsedMilliseconds);
Console.WriteLine("start time:{0}, end time:{1}", startTime.ToString(DATE_FORMAT, CultureInfo.InvariantCulture), endTime.ToString(DATE_FORMAT, CultureInfo.InvariantCulture));
}
这段代码的目的也很清晰,就是向DateTime的AddTicks方法传入StopTime的ElapsedTicks来计算endTime。看起来还是蛮完美的,我们来看一下执行的结果:
End Time的值并不是我们期望的start time加上300ms,也就是说这样计算end time是错误的,这究竟是为什么呢?我们从MSDN上找到了答案:
Stopwatch ticks are different from DateTime.Ticks . Each tick in the DateTime.Ticks
value represents one 100-nanosecond interval. Each tick in
theElapsedTicks value represents the time interval equal to 1 second
divided by the Frequency .
From < https://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.elapsedticks(v=vs.110).aspx >
简单来说,就是Stopwatch的tick和DateTime的ticks是不同的概念,DateTime中的tick的值是100ns为一
个tick,而stopwatch中的elapsedTicks所表示的tick的值则是1/Frequency,两者是不同的。那么是不是说我们就没有
办法通过ticks来把两者联系起来了呢,不然,请看下面代码:
static void StopAndDateTimeTest()
{
Stopwatch sw = new Stopwatch();
string DATE_FORMAT = "yyyy-MM-dd HH:mm:ss.ffff";
//起始时间
DateTime startTime = DateTime.UtcNow;
//开始计时
sw.Start();
//300ms
Thread.Sleep(300);
//计时结束
sw.Stop();
//得到结束的时间
//DateTime endTime = startTime.AddTicks(sw.ElapsedTicks);
//这里把ElapsedTicks改成Elapsed.Ticks,注意中间多了一个点
DateTime endTime = startTime.AddTicks(sw.Elapsed.Ticks);
Console.WriteLine("elpase time {0}", sw.ElapsedMilliseconds);
Console.WriteLine("start time:{0}, end time:{1}", startTime.ToString(DATE_FORMAT, CultureInfo.InvariantCulture), endTime.ToString(DATE_FORMAT, CultureInfo.InvariantCulture));
}
执行的结果如下:
可以看到这就是我们想要的结果,所以Stoptime的elapsed的Ticks也是以100ns为单位的。若是想要和DateTime配合,需要使用这个ticks。
2016-07-19
展开全部
DateTime.Now.Ticks 是指从DateTime.MinValue之后过了多少时间,10000000为一秒,保存在long类型的变量里,可以将它传到datetime的构造函数内转成时间类型。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication26
{
class Program
{
static void Main(string[] args)
{
long ticks = DateTime.Now.Ticks;
DateTime now = new DateTime(ticks);
Console.WriteLine(now.ToString("yyyy-MM-dd hh:mm:ss"));
Console.ReadLine();
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication26
{
class Program
{
static void Main(string[] args)
{
long ticks = DateTime.Now.Ticks;
DateTime now = new DateTime(ticks);
Console.WriteLine(now.ToString("yyyy-MM-dd hh:mm:ss"));
Console.ReadLine();
}
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询