GVKun编程网logo

为什么time.sleep()在Windows中如此之慢?(windows time wait过多的原因)

2

如果您想了解为什么time.sleep和在Windows中如此之慢?的知识,那么本篇文章将是您的不二之选。我们将深入剖析为什么time.sleep的各个方面,并为您解答在Windows中如此之慢?的疑

如果您想了解为什么time.sleep在Windows中如此之慢?的知识,那么本篇文章将是您的不二之选。我们将深入剖析为什么time.sleep的各个方面,并为您解答在Windows中如此之慢?的疑在这篇文章中,我们将为您介绍为什么time.sleep的相关知识,同时也会详细的解释在Windows中如此之慢?的运用方法,并给出实际的案例分析,希望能帮助到您!

本文目录一览:

为什么time.sleep()在Windows中如此之慢?(windows time wait过多的原因)

为什么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一起正常工作

.net – 为什么Windows服务不能与System.Timers.Timer或System.Windows.Forms.Timer一起正常工作

我最近遇到了编写Windows服务的挑战.我需要定期请求URL并检查其可用性.为此,我决定在服务的OnStart方法中初始化一个计时器,并在timer_Tick事件中完成所有工作.

我的第一种方法是使用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.Windows.Forms.Timer计时器使用UI的消息泵来编组tick事件,默认情况下服务不运行消息泵,因此没有一点额外的工作,System.Windows.Forms.Timer计时器将不会工作.

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在更新过程中运行得如此之慢?

android – 为什么NotificationManager在更新过程中运行得如此之慢?

我通过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);
}

那为什么它的工作如此之慢?

解决方法

这是一种常见的行为.您不应该频繁更新泛洪notificationmanager.您应该决定更新的时间间隔,例如每秒两次.

例如,

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完成代码的速度如此之慢?

c – 为什么在Emacs中使用CEDET完成代码的速度如此之慢?

我最近尝试了KDevelop.它比语义完全自插入或M-Ret更快(即时)查找符号(变量,函数名,类,结构…).使用M-Ret的速度更快,但它没有像其他IDE那样好的格式,而是像From nil>这样无意义的格式.在emacs中,我必须等待至少~1秒,在许多情况下,等待CEDET查找所有包含的相关源文件,这需要很长时间.

我使用了auto auto clang,但似乎没有速度提升.为什么会这样:(?我喜欢Emacs和所有,并且在我发现KDevelop之前已经将它用于我的C/C++差不多一年了,但是使用Emacs意味着代码完成应该是微不足道的和可选的?

解决方法

这个最简单的答案很可能是KDevelop的DUChain和解析器是用(我推测)C编写的,其中令牌管理类似地构建. CEDET的解析器都在Emacs Lisp中,数据库和查找也在Emacs Lisp中.虽然在Emacs中对完成引擎的调用之间构建和缓存了一些表,但是在代码更改时(由于键入),它们经常被重建.构建所有表后,CEDET完成引擎可以非常快.

我已经在代码完成上运行了许多配置文件以使事情变得更快,在阅读了一些关于duchain之后,看起来KDevelop有一个用于整个项目的主符号表. CEDET无法执行此操作,因为并非所有文件都在项目中,因此每个文件都需要创建一个临时表.我已经了解了很长一段时间,但从未将CEDET的符号数据库外部化,以便可以在单独的线程(进程)中构建和维护这些表.

c – 为什么连接调试器的运行速度如此之慢?

c – 为什么连接调试器的运行速度如此之慢?

发生了什么导致调试版本与未附加的版本相比,附加到调试器的速度要慢得多?它们都是相同的exe运行.

编辑:大多数答案都集中在断点上.我仍然像没有断点的泥浆,OutputDebugString或观察窗口中的任何东西一样运行.那么调试CRT,运行时堆栈检查和调试堆呢?

解决方法

如果它不是OutputDebugString或者成堆的断点会减慢一切,请尝试以下方法:

> 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 – 为什么连接调试器的运行速度如此之慢?等更多相关知识的信息可以在本站进行查询。

本文标签: