我将给出方法代码的顶部,因为整个代码很长,在这种情况下不需要。
static int tickCountLength = 1000;
int[] tickCounts = new int[tickCountLength];
int numberOfTicks = 0;
TimeSpan dtn;
void DoCaptureRenderTarget(Device device, string hook)
{
//Environment.TickCount-->array
tickCounts[numberOfTicks] = Environment.TickCount;
numberOfTicks++;
DateTime start1 = DateTime.Now;
DateTime end1 = DateTime.Now;
this.DebugMessage("Capture Time Testing " + (end1 - start1).ToString());
dtn = end1 - start1;
if (dtn.Seconds > 0)
{
string fffff = "fgf";
}
if (numberOfTicks >= tickCountLength)
{
StreamWriter w = new StreamWriter(@"c:\Milliseconds\TickCount.txt", true);
foreach (int tick in tickCounts)
{
w.WriteLine("TickCount === > " + tick.ToString());
}
w.Close();
numberOfTicks = 0;
}
每隔1ms或20ms调用该方法不确定实时。 所以我添加了这个部分试图计算:
DateTime start1 = DateTime.Now;
DateTime end1 = DateTime.Now;
this.DebugMessage("Capture Time Testing " + (end1 - start1).ToString());
dtn = end1 - start1;
if (dtn.Seconds > 0)
{
string fffff = "fgf";
}
但是这肯定是错误的,因为end1和start1之间的时间是00:00:00:00 我怎样才能用毫秒计算每次方法的时间?
也许:每次使用DateTime.Now.Millisecond并手动减去前一个(通过查看)?不知道怎么做。
答案 0 :(得分:3)
示例:
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
Thread.Sleep(10000);// or whatever code you want to calculate elapsed time.
stopWatch.Stop();
// Get the elapsed time as a TimeSpan value.
TimeSpan ts = stopWatch.Elapsed;
// Format and display the TimeSpan value.
string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
ts.Hours, ts.Minutes, ts.Seconds,
ts.Milliseconds / 10);
Console.WriteLine("RunTime " + elapsedTime);
答案 1 :(得分:2)
Stopwatch
就是您所需要的。这是一个简单的例子:
Stopwatch sw= new Stopwatch();
sw.Start();
// your methods to be measured
sw.Stop();
TimeSpan ts = stopWatch.Elapsed;
//Format
string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
ts.Hours, ts.Minutes, ts.Seconds,
ts.Milliseconds / 10);
Console.WriteLine("RunTime " + elapsedTime);
请注意,虽然秒表可能存在多线程异步应用程序的问题,因为它只能测量一个核心的速度。此问题可能会导致某些不同步,并给您一些不正确的时间。取决于您的应用程序,使用DateTime.UtcNow
可能会更好,但它不如单个线程上的Stopwatch
精确。 (据我所知)
进一步阅读:
答案 2 :(得分:2)
问题是你没有电话,也没有
之间的逻辑DateTime start1 = DateTime.Now;
和
DateTime end1 = DateTime.Now;
因此,经历的时间非常小,难以察觉也就不足为奇了。把
DateTime start1 = DateTime.Now;
在逻辑之前。
static int tickCountLength = 1000;
int[] tickCounts = new int[tickCountLength];
int numberOfTicks = 0;
TimeSpan dtn;
void DoCaptureRenderTarget(Device device, string hook)
{
//Environment.TickCount-->array
DateTime start1 = DateTime.Now;
tickCounts[numberOfTicks] = Environment.TickCount;
numberOfTicks++;
DateTime end1 = DateTime.Now;
this.DebugMessage("Capture Time Testing " + (end1 - start1).ToString());
dtn = end1 - start1;
if (dtn.TotalMilliseconds > 0)
{
string fffff = "fgf";
}
if (numberOfTicks >= tickCountLength)
{
StreamWriter w = new StreamWriter(@"c:\Milliseconds\TickCount.txt", true);
foreach (int tick in tickCounts)
{
w.WriteLine("TickCount === > " + tick.ToString());
}
w.Close();
numberOfTicks = 0;
}
我不确切地知道你想要及时测量你方法中的逻辑。
答案 3 :(得分:1)
您可以像这样使用stopwatch:
var watch = Stopwatch.StartNew();
// your code for which you want to measure time comes here
watch.Stop();
var elapsedMillisecond = watch.ElapsedMilliseconds;
您还可以使用Environment.TickCount Property
这是John Chapman's blog post关于DateTime给出的一个很好的读数。如果你想知道为什么不建议使用DateTime.Now以及为什么这么精确,那就是精确的。
另请阅读这篇有趣的文章:The Darkness Behind DateTime.Now
答案 4 :(得分:1)
好的,首先,您最好使用Environment.TickCount
而不是DateTime.Now
,尤其是在测量间隔时。
其次,在调用DateTime.Now
(或Environment.TickCount
时),当您调用DateTime
get方法时,实际上会得到Now
对象。因此,如果您将这些方法一个接一个地放置,您将获得的结果是相同的。
我真的不明白你要测量的是什么,但在C#中测量时间的正确方法可能是
int start = Environment.TickCount;
FunctionToMeasure();
int end = Environment.TickCount;
int diffMS = end - start; //This is the measured time of the function.
如果您要测量实际DateTime.Now
函数所需的时间,则为0ms
。
希望我帮助过了:)!