鉴于C#中的Stopwatch类可以使用下面的三个不同的计时,例如 系统计时器,例如大约+-10 ms的精度取决于可以使用 timeBeginPeriod 可以大约+-1 ms. 时间邮票计数器(TSC),例如tick频率为2.5MHz或1个tick = 400 ns因此,理想情况下是一个精确度. 高精度事件计时器(HPET),例如tick频率为25MHz或1个tick = 40 ns因此,理想情况下是精确的. 我们如何测量可观察到的精度?精度被定义为 精度是指两个或多个测量值与每个测量 其他. 现在,如果Stopwatch使用hpet,这是否意味着我们可以使用Stopwatch获得与计时器频率相等的精度测量值? 我不这么认为,因为这要求我们能够使用零方差或完全固定的开销的计时器,据我所知,对于Stopwatch而言,这是不正确的.例如,使用HPET并致电: var before_ticks = Stopwatch.GetTimestamp();
以下是关于 stopwatch 的编程技术问答
例如 foo() //Some operation bound by an external resource. db,I/O, whatever. vs. var watch = new Stopwatch(); watch.Start(); foo() var time = watch.ElapsedMilliseconds watch.Stop(); 解决方案 我相信秒表是在QueryPerformanceCounter的顶部构建的,因此每个调用都会导致内核过渡.如果foo()非常简短,则QPC开销将使它相形见war. 如果您使用秒表来测量短任务,则应多次运行foo(例如数千),并在整个批次周围使用秒表.将总时间除以运行数以获得任务的平均时间. 其他解决方案 这听起来像是递归的答案,但是真正了解秒表的惩罚的唯一方法是测量它.测量托管代码通常涉及秒表实例. 秒表仅用于诊断目的,不应在零售应用程序中使用.当然,除非您处于诊断模式.因此,对于非诊
我们都知道 spotwatch 可能会在所有核心上运行的多线程异步应用程序中存在问题. 在多处理器计算机上,线程运行的哪个处理器都无关紧要.但是,由于BIOS或硬件抽象层中的错误(HAL),您可以在不同的处理器上获得不同的计时结果.要指定线程的处理器亲和力,请使用processThread.processoraffication方法. 我有什么办法可以在CPU内核中获得一些具有高分辨率/准确性的可靠tick/Timestamp值? 是一致的? 如果不可能使秒表(QueryPerformanceCounter)多核安全,那么在核心上获得良好时间戳的下一个最佳方法是什么? dateTime.utcnow.ticks 或环境.还有其他计数器吗? 我确实需要比dateTime.utcnow.ticks提供的更好的分辨率. (10-15ms) 解决方案 我本人搜索了这个特定问题的答案,而我看到的最好的是dateTime.utcnow.看来没有窗户暴露高分辨率和可靠
我完全混淆了这4. Elapsedmilliseconds(long),ElapsedTicks(long),atapsed.totalmilliseconds(double)(double)和Evered.milliseconds(int)之间有什么区别? 我有一个函数 { Stopwatch sw = new Stopwatch(); sw.Start(); MyTimeConsumingAction(); sw.Stop(); sw.//what? } 我如何从秒表中的秒表对象的长期运行过程中耗尽正确的时间? 编辑:我尝试了MSDN文档,但那里没有任何详细信息. 解决方案 Elapsed.TotalMilliseconds (double)返回以来已经过去的全部和分数的总数 例如.在1.23456秒停止的秒表将在此属性中返回1234.56.请参
我想看看一个函数正在运行多长时间.因此,我在表单上添加了一个计时器对象,然后提出了此代码: private int counter = 0; // Inside button click I have: timer = new Timer(); timer.Tick += new EventHandler(timer_Tick); timer.Start(); Result result = new Result(); result = new GeneticAlgorithms().TabuSearch(parametersTabu, functia); timer.Stop(); 和: private void timer_Tick(object sender, EventArgs e) { counter++; btnTabuSearch.Text = counter.ToString(); } ,但这没有计算任何东西.为什么? 解决方案
system.diagnostics.stopwatch 的准确性如何?我正在尝试为不同的代码路径做一些指标,我需要确切地说.我应该使用秒表还是还有另一个更准确的解决方案. 我被告知有时秒表会提供不正确的信息. 解决方案 为什么您不介绍您的代码而不是专注于微基准? 有一些不错的开源探索者,例如: 其他解决方案 我刚刚写了一篇文章,该文章说明了如何进行测试设置,以使秒表从秒表中获得高精度(大于0.1ms).我认为这应该解释一切. http://www.codeproject.com/kb/testing/stopwatch-measure-precise.aspx 其他解决方案 system.diagnostics.stopwatch类确实准确地测量了时间,但是ElapsedTicks方法的工作方式使某些人得出了一个不准确的结论,当他们实际上只有逻辑错误代码. 某些开发人员认为秒表不准确的原因是,从秒表中的ElapsedTicks不等同于日期
我想跟踪代码的性能,因此我使用System.DateTime.Now存储了开始和结束时间.作为执行代码的时间,我将两者之间的区别在于. 我注意到差异似乎并不准确.因此,我尝试使用Stopwatch对象.事实证明这要精确得多. 谁能告诉我为什么Stopwatch使用System.DateTime.Now? 计算开始时间和结束时间之间的差异更准确 顺便说一句,我不是在谈论十分之一.我的差异约为15-20%. 解决方案 按照 msdn /p> 秒表通过计算基础计时器机制中的计时器滴答来测量所经过的时间.如果已安装的硬件和操作系统支持高分辨率性能计数器,则秒表类使用该计数器来测量经过的时间.否则,秒表类使用系统计时器来测量经过的时间.使用频率和高分辨率字段来确定秒表正时实现的精度和分辨率. 它使用的分辨率/精度比DateTime.Now 更高 您也可以查看以下相关链接: emoverition.tickcount.tickcount vs dateT
我想在JavaScript中进行秒表,以计算毫秒,秒,分钟和小时.问题在于它似乎没有以适当的速度进行,这意味着当我将其与其他计时器进行比较时,它逐渐变得比它们慢(即计时器计数随时间变慢的速度).因此,突然之间存在5秒的差异,然后变成7秒的差异,依此类推.任何帮助,将不胜感激. 我的秒表代码. var hr = 0; var min = 0; var sec = 0; var count = 0; var Startbutton = document.getElementById("Start"); var timer = false; function start() { Startbutton.disabled = true; //this wil help to avoid multiple clicking on function timer = true; stopwatch(); } function stop() { timer = false
我在此应用中创建一个计数器,当我单击一个按钮并单击同一按钮时停止时,它会开始. 问题是,当我再次启动时,显示计数的标签不会重置它可以使计数从停止的位置保持. 所以有人可以帮助我?? - (void)timerTick:(NSTimer *)timer { _lblCounter.text = @"0:00:00"; double seconds = 0.0; double minutes = 0.0; double hours = 0.0; ticks += 1.0; seconds = fmod(ticks, 60.0); minutes = fmod(trunc(ticks / 60.0), 60.0); hours = trunc(ticks / 3600.0); _lblCounter.text = [NSString stringWithFormat:@"%2.0f:%02.0f:%02.0f", hours, minutes, seconds]; }
我正在构建一个应用程序,该应用程序作为其附件功能.我正在尝试做类似于iOS停止观看的事情.我停止了,重置功能有效,但无法开始(一旦停止并单击"开始"),并且单圈功能正常工作.我试图四处寻找这个问题,但是除了一次启动并重置停止观看教程外,我找不到任何东西.有人可以在这里帮助我吗? // Stop Watch Code Begins - (void)updateTimer { NSDate *currentDate = [NSDate date]; NSTimeInterval timeInterval = [currentDate timeIntervalSinceDate:startDate]; NSDate *timerDate = [NSDate dateWithTimeIntervalSince1970:timeInterval]; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [date
我正在尝试开发一个包含简单秒表功能的应用程序.我正在使用Xcode 6和Swift语言.这是FirstViewController中的代码 @IBAction func Stopwatch (Sender:UIButton) { var startTime = NSTimeInterval() func updateTime(timer:NSTimer) { //Find Current TIme var currentTime = NSDate.timeIntervalSinceReferenceDate() //Find the difference between current time and start time var elapsedTime :NSTimeInterval = currentTime - startTime //calculate the minu
我有一个使用Centisecond(0.01秒)更新间隔的NSTIMER的应用程序,以00:00.00(MM:SS.SS)显示字符串格式的运行秒表. (基本上将iOS内置秒表克隆到实时体育计时数学问题中,将来可能需要毫秒的准确性) 我使用(滥用?)nstimer强迫uilabel更新.如果用户按下开始,这是用于开始重复该函数的NSTIMER代码: displayOnlyTimer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: Selector("display"), userInfo: nil, repeats: true) 这是上述nstimer执行的函数: func display() { let currentTime = CACurrentMediaTime() - timerStarted + elapsedTime if currentTim
Google拥有其时钟应用程序,其中包括秒表.我目前正在尝试在我的应用程序A(计数)计时器中创建,或者您可以称其为秒表,可以在后台运行,当它在后台运行时,我希望它也显示通知,显示其计数时间和"停止"按钮(所有这些都发生在Google Clock App() ).对于我的应用程序中的计时器,我正在使用一个张贴可运行的处理程序,该处理程序正在发布自己.我正在Java上写我的应用程序. 定义"计时器"的代码(处理程序和可运行): Handler timerHandler = new Handler(); Runnable timerRunnable = new Runnable() { @Override public void run() { long millis = System.currentTimeMillis() - startTime; seconds = (millis / 1000) + PrefUtil.getTi
我在程序中使用time.sleep(10).我运行程序时可以在外壳中显示倒数吗? >>>run_my_program() tasks done, now sleeping for 10 seconds ,然后我希望它做10,9,8,7 .... 这是可能的吗? 解决方案 您总是可以做 #do some stuff print 'tasks done, now sleeping for 10 seconds' for i in xrange(10,0,-1): time.sleep(1) print i 此片段具有稍微烦人的功能,每个数字都会在新线上打印出来.为了避免这种情况,您可以 import sys import time for i in xrange(10,0,-1): sys.stdout.write(str(i)+' ') sys.stdout.flush() time.sleep(1) 其他
我有一个在其他线程中运行的秒表,它在标签中更新GUI线程以显示随着时间的流逝而显示.当我的程序关闭时,当我在GUI中调用this.Invoke(mydelegate);时,它会抛出a ObjectDisposedException,以通过秒表的时间更新标签. 我如何摆脱这个ObjectDisposedException? 我试图在格式插入事件中停止秒表,但它无法处理. 这是代码: System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch(); stopwatch = sw; sw.Start(); //System.Threading.Thread.Sleep(100); System.Threading.Thread t = new System.Threading.Thread(deleg
我正在尝试在许多线程上尽可能准确地测量某些代码的执行时间,从而考虑上下文切换和线程停机时间.该应用程序在C#(VS 2008)中实现.示例: public void ThreadFunc () { // Some code here // Critical block #1 begins here long lTimestamp1 = Stopwatch.GetTimestamp (); CallComplex3rdPartyFunc (); // A long lTimestamp2 = Stopwatch.GetTimestamp (); // Critical block #1 ends here // Some code here // Critical block #2 begins here long lTimestamp3 = Stopwatch.GetTimestamp ();
如果我有共享System.Diagnostics.Stopwatch实例,多个线程可以安全地调用shared.ElapsedTicks并获得准确的结果? 以这种方式使用秒表的共享实例与使用静态GetTimeStamp()方法之间的线程安全/准确性有什么区别? 我的测量间隔约为180ms,发现使用共享实例的结果使我的结果更大,其中包括比我预期的要短的大量数字. 该机器具有多个CPU(2 * Intel X5550的价值) 解决方案 来自 msdn> msdn P> 不能保证任何实例成员是线程安全的. 其他解决方案 因此,如果您启动共享实例,则不修改它并仅调用ElapsedXXX属性,您应该可以. 其他解决方案 查看源代码,它不是线程安全.
我正在循环运行,并以以下方式启动任务: var iResult = new List(); foreach(var i in myCollection) { var task = Task.Factory.StartNew(() => DoSomething(), TaskCreationOptions.LongRunning); task.ContinueWith(m => myResponseHandler(m.Result)); iResult.Add(task); } 在我的DoSomething()方法中,我有一个计时器: public static myMsg DoSomething() { var timer = System.Diagnostics.Stopwatch.StartNew(); DoLongRunningTask(); //If it matters