如果您想了解为什么time.sleep和在Windows中如此之慢?的知识,那么本篇文章将是您的不二之选。我们将深入剖析为什么time.sleep的各个方面,并为您解答在Windows中如此之慢?的疑
如果您想了解为什么time.sleep和在Windows中如此之慢?的知识,那么本篇文章将是您的不二之选。我们将深入剖析为什么time.sleep的各个方面,并为您解答在Windows中如此之慢?的疑在这篇文章中,我们将为您介绍为什么time.sleep的相关知识,同时也会详细的解释在Windows中如此之慢?的运用方法,并给出实际的案例分析,希望能帮助到您!
本文目录一览:- 为什么time.sleep()在Windows中如此之慢?(windows time wait过多的原因)
- .net – 为什么Windows服务不能与System.Timers.Timer或System.Windows.Forms.Timer一起正常工作
- android – 为什么NotificationManager在更新过程中运行得如此之慢?
- c – 为什么在Emacs中使用CEDET完成代码的速度如此之慢?
- c – 为什么连接调试器的运行速度如此之慢?
为什么time.sleep()在Windows中如此之慢?(windows time wait过多的原因)
我正在循环1000次,延时1ms,计算总时间。 总时间是15.6秒而不是1,这非常有趣。当我打开谷歌浏览器并浏览一些网站时,它总共运行了1秒。 另外,它也与Macbook一起运行良好。 我想知道我需要做什么样的解决scheme来解决这个问题? 请尝试运行它没有Chrome打开一个与Chrome打开看到的区别。 当我的系统上打开Quora或Reddit或Stackoverflow时,它正常运行。
from timeit import default_timer as timer import time start = timer() for i in range(1000): time.sleep(0.001) end = timer() print ("Total time: ",end - start)
编辑:我没有在Python上运行它。 我只是打开了Chrome浏览器并浏览了一些网站来加速时间延迟。
更新:这是关于Windows的计时器分辨率。 所以Chrome基本上将定时器分辨率从15.6ms改为1ms。 这篇文章解释得非常好: https : //randomascii.wordpress.com/2013/07/08/windows-timer-resolution-megawatts-wasted/
带callbackpython虚拟机的pthread
通过eventfd在线程之间传输数据
_fread_nolock,_fseek_nolock的用途是什么?
使用multithreading来定期强制检查软件更新的问题
使用beginthreadex创build线程时挂起debugging应用程序
如何安全地迭代互锁的slist?
线程fs段寄存器在用户和内核之间切换
Threaded Python端口扫描器
专用线程(每个连接一个线程)具有缓冲function(c / c ++)
如何开始与c + +中的线程(返回)
我终于弄明白了。 非常感谢评论。 那些提示我解决它。 为了解释为什么发生这种情况,Windows操作系统的默认定时器分辨率设置为15.625 ms或64 Hz,这对于大多数应用程序来说足够体面。 但是,对于需要非常短的采样率或时间延迟的应用,15.625 ms是不够的。 所以,当我自己运行程序的时候,它在1000点的时候被锁定在15.6秒。 但是,当Chrome打开时,会触发更高分辨率的计时器,并将其更改为1 ms而不是15.6,这导致我的程序按预期运行。
因此,为了解决这个问题,我需要调用一个名为timeBeginPeriod(period)的Windows函数来更改分辨率计时器。 幸运的是,python使我可以通过提供ctypes库来修复它。 最终代码如下所示:
from time import perf_counter as timer import time from ctypes import windll #new timeBeginPeriod = windll.winmm.timeBeginPeriod #new timeBeginPeriod(1) #new start = timer() for i in range(1000): print (i) time.sleep(0.001) end = timer() print ("Total time: ",end - start)
警告:我读了这个高定时器分辨率将如何影响整体性能和电池。 我还没有看到任何事情发生,并且Windows任务管理上的活动cpu使用率似乎也无法压倒。 但请记住,如果您的应用程序碰巧造成一些奇怪的行为。
.net – 为什么Windows服务不能与System.Timers.Timer或System.Windows.Forms.Timer一起正常工作
我的第一种方法是使用System.Windows.Forms.Timer及其Tick事件.我选择了它,因为我正在阅读的教程.不知怎的,我无法使服务工作.它安装并启动没有问题,但它不会触发事件(我将调试器附加到进程并看到它没有被触发).我认为在Windows服务中使用Forms计时器可能不是一个好主意,因此我决定切换到System.Timers.Timer并利用其Elapsed事件.这也不起作用.我在Windows窗体应用程序中尝试了两种提到的方法,但它们都有效.
经过一番挖掘后,我发现这个网站:http://weblogs.asp.net/sibrahim/archive/2004/01/13/58429.aspx,博主建议使用另一个计时器:System.Threading.Timer.我第三次改变了这种方法,BOOM开始像魅力一样工作.
我的问题是:为什么我不能在Windows服务中使用其他计时器,为什么找到有关它的信息这么困难?
System.Timers.Timer是一个基于服务器的计时器,并在您创建它的线程上引发一个事件(我认为).如果这不起作用,也许你没有启动计时器或计时器在一个立即结束的线程上运行(因为,没有任何东西保持线程活着,所以它完成).
http://msdn.microsoft.com/en-us/library/system.timers.timer.aspx
System.Threading.Timer计时器使用在ThreadPool线程上运行的回调,并且根本不依赖于消息泵,因此这有效.
当您在WinForms项目中运行Application.Run(myForm)时,该调用也会运行消息泵,这将管理UI消息.您提到的Windows计时器是一个UI组件,并期望消息泵运行,以便在UI线程上发生tick事件.
看看这里在Windows服务中运行消息泵:
Message pump in .NET Windows service
进一步阅读:
http://support.microsoft.com/kb/842793
总之,我只是使用System.Threading.Timer类.
android – 为什么NotificationManager在更新过程中运行得如此之慢?
我使用NotificationCompat.Builder,它在类字段中缓存.因此,进度发布非常简单:
manager.notify(id,uploader. setProgress(MAX_PROGRESS,(int) (progress * 100),false). build() );
保证更新进度从主线程执行(包装在Handler装饰器中).
this.request.setCallback(new UploaderDecorator(this.request.getCallback()));
进展情况如下:
long total = file.length(); long uploaded = 0; int bytesRead = input.read(buffer,bufferSize); while (bytesRead > 0) { output.write(buffer,bufferSize); uploaded += bytesRead; callback.onUploadProgress(activeFile,((float) uploaded / total)); bytesRead = input.read(buffer,bufferSize); }
那为什么它的工作如此之慢?
解决方法
例如,
long startTime; long elapsedtime = 0L; if (elapsedtime > 500) { new Handler(Looper.getMainLooper()).post(new Runnable() { @Override public void run() { mBuilder.setProgress(100,(int) newValue,false); mNotifyManager.notify(notificationID,mBuilder.build()); startTime = System.currentTimeMillis(); elapsedtime = 0; } }); Log.d("Andrognito",newValue + "Progress"); } else elapsedtime = new Date().getTime() - startTime;
这对我来说非常合适,也不会冻结通知.
c – 为什么在Emacs中使用CEDET完成代码的速度如此之慢?
我使用了auto auto clang,但似乎没有速度提升.为什么会这样:(?我喜欢Emacs和所有,并且在我发现KDevelop之前已经将它用于我的C/C++差不多一年了,但是使用Emacs意味着代码完成应该是微不足道的和可选的?
解决方法
我已经在代码完成上运行了许多配置文件以使事情变得更快,在阅读了一些关于duchain之后,看起来KDevelop有一个用于整个项目的主符号表. CEDET无法执行此操作,因为并非所有文件都在项目中,因此每个文件都需要创建一个临时表.我已经了解了很长一段时间,但从未将CEDET的符号数据库外部化,以便可以在单独的线程(进程)中构建和维护这些表.
c – 为什么连接调试器的运行速度如此之慢?
编辑:大多数答案都集中在断点上.我仍然像没有断点的泥浆,OutputDebugString或观察窗口中的任何东西一样运行.那么调试CRT,运行时堆栈检查和调试堆呢?
解决方法
> Windows调试堆 – 如果调试堆在调试器下运行,您的进程将获得调试堆,没有问题.要在Visual Studio调试器下运行时禁用此功能,请访问项目属性的调试页面,并将_NO_DEBUG_HEAP = 1添加到环境中.
(Windows调试堆与CRT调试堆是分开的.如果它在调试器下运行,你的发布版本也将获得Windows调试堆.)
>该程序加载了许多带符号的DLL.加载DLL时,Visual Studio会尝试为其查找符号.如果有可用的符号,这可能需要一些时间.除了重新安排你的程序以便它不经常加载DLL之外,你无能为力.
>检查对IsDebuggerPresent的任何调用 – 这可能会在调试器中运行和外部调用之间引入任意差异.
(作为最后的一次性建议 – 我也会怀疑在调试过程时异常(无论是C还是结构化)可能会更多地涉及.所以如果你的程序投入很多,那么当它的程序可能会慢一点时正在调试.)
今天关于为什么time.sleep和在Windows中如此之慢?的介绍到此结束,谢谢您的阅读,有关.net – 为什么Windows服务不能与System.Timers.Timer或System.Windows.Forms.Timer一起正常工作、android – 为什么NotificationManager在更新过程中运行得如此之慢?、c – 为什么在Emacs中使用CEDET完成代码的速度如此之慢?、c – 为什么连接调试器的运行速度如此之慢?等更多相关知识的信息可以在本站进行查询。
本文标签: