为什么单击并按住标题栏,程序运行得更快?

news2024/11/17 11:54:05

有时候,人们会发现这样一个怪异现象:如果在执行一项长时间运行的任务的时候,在标题栏按下鼠标,这个时候,会发现程序运行的更快了一些。

这件奇怪的事情通常是发生在这样一种场景:当程序花费太多时间更新其进度状态而没有足够的时间用来做实际的计算工作。
(换句话说,程序员搞砸了。)

当你在标题栏上单击并按住鼠标时,窗口管理器会等待下一条鼠标消息,以便它可以确定你是单击标题还是尝试拖动。在等待期间,窗口的绘制工作将暂时停止。
这就是为什么程序运行得更快的原因:没有窗口绘画意味着花在更新上的 CPU 会减少,而无论如何更新都比读取更快。让我们通过一个简单的例子程序来演示这个现象。

>> 请移步至 topomel.com 以查看图片 <<

这个程序启动了一个后台线程,它计数到 100000,并且每次数值改变时都会使前台窗口无效。运行它,看数字加到 100000会有多快。(当循环结束时,我添加了一个小声音提示,所以你可以通过听声音提示来判断时间。)

现在再次运行它,但这一次,单击并按住标题栏上的鼠标。请注意,程序几乎立即发出声音提示:当你按住鼠标时,它运行得更快。这是因为所有绘画都被单击并按住标题时触发的可能拖动操作正在进行中抑制。

每次增加就更新屏幕显然是无意义的,因为增加得速度远远快于屏幕刷新速度,更不用说人眼读取速度。根据经验,每秒改变进度状态超过 10 次通常是无意义的。你在屏幕更新上付出的努力都白白浪费了。

让我们修改一下示例程序,使其每秒最多更新十次。我们将以 100ms 为间隔运行计时器,检查是否有任何更改,并重新绘制屏幕。

>> 请移步至 topomel.com 以查看图片 <<

我们不是在每次计数器改变值时就更新屏幕,而是仅仅设置一个”嘿,有些东西改变了”的标志,并在计时器上检查它。我们在生产者线程中使用释放语义来设置标志(因为我们希望在交换发生之前完成所有挂起的存储操作)并使用获取语义在消费者线程中清除标志(因为我们不希望将来任何的存储操作都被推测在交换之前)。

再次运行该程序,注意它瞬间计数直到 100000。当然,这并不能真正演示进度计数器,因此将 Sleep(1) 插入循环中:

>> 请移步至 topomel.com 以查看图片 <<

这足以使循环的速度变慢,因而可以看见递增的值。并不是像在最初版本中看见的令人眼花缭乱的递增,但是足以使人们领会其含义。

我用于在后台和前台线程之间传递信息的机制假定后台更新相对频繁,这样计时器几乎总会发现一些值得做的事情。如果混合执行一些快速和慢速任务,可以修改通信机制,这样当注意到一段时间没有更新时,计时器将自行关闭。后台线程恢复更新值时需要重新启动计时器。我没有费心编写这种更复杂的版本,因为这只会分散文章的要点。

总结

我曾经也想过将程序的每次状态变更都呈现在用户界面上,觉得这可以让用户了解程序的实时运行状态。但是在后来的实际体验中,我感觉这并不是想象中那样美好。
从用户的角度来说,他/她所希望的事情是:赶紧帮我把活儿做完,别成天整这些花里胡哨的东西。

确实如此!毕竟大家都这么忙。

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《Why does my program run faster if I click and hold the caption bar?》

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/682330.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

手机录屏录音不用愁,这些方法无需ROOT就能内录声音!

现在不少人喜欢用视频分享生活&#xff0c;除了外拍视频&#xff0c;或多或少也有需要内录视频的时候&#xff0c;比如录个操作步骤啊、游戏视频啊&#xff0c;或者录个网课、录首歌啥的… 之前也有不少粉丝留言问过我这个问题&#xff0c;所以今天就打算来和大家简单分享一下…

JSP自定义标签【上】

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于自定义标签的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.什么是标签 二.什么是自定义标签…

国产骨传导耳机哪个牌子好,分享几款表现不错的国产骨传导耳机

骨传导耳机是一种新兴的耳机技术&#xff0c;其原理是将声音转化为不同频率的机械振动&#xff0c;通过人的颅骨、骨迷路、内耳淋巴液、螺旋器、听觉中枢来传递声波&#xff0c;不通过鼓膜&#xff0c;不入耳&#xff0c;不影响耳朵的听觉。听音乐是人们生活中不可缺少的一部分…

二叉树OJ题:LeetCode--965.单值二叉树

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下LeetCode中第965道二叉树OJ题&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; 数据结构与算法专栏&#xff1a;数据结构与算法 个 人…

python旅游推荐系统-计算机毕设 附源码82884

旅游推荐系统 摘 要 随着社会的快速发展和人们生活水平的不断提高&#xff0c;旅游已逐渐成为人们生活的重要组成部分&#xff0c;用户能够获取旅游信息的渠道也随信息技术的广泛应用而增加。大量未经过滤的信息在展示给用户的同时&#xff0c;也淹没了用户真正感兴趣的信息。为…

二十三种设计模式第十一篇--桥接模式

好久没写博客了&#xff0c;自从进入6月份&#xff0c;毕业季&#xff0c;全是在忙毕业的事情&#xff0c;都没怎么学习代码软件工程知识了&#xff0c;这二十三种设计模式还是得学完哈&#xff01;持之以恒&#xff0c;我本来为了学这二十三种设计模式的初衷是为了顺利度过软考…

Azkaban的安装教程

Azkaban的安装教程 文章目录 Azkaban的安装教程写在前面集群模式安装下载安装包上传 **tar** 包解压配置 **MySQL**配置 **Executor Server**编辑 azkaban.properties同步 azkaban-exec到所有节点启动 executor server激活 executor **配置** **Web Server**编辑 azkaban.prope…

短视频seo源码搭建技术分享

一、目录及主要文件说明 bootstrap目录&#xff0c;存放框架引导及启动文件&#xff0c;非底层改动&#xff0c;无需修改。其中的functions.inc中可以定义一些全局函数error目录&#xff0c;存放404、500等常见错误模板文件&#xff0c;非需勿动includes目录&#xff0c;drupal…

SpringBoot 如何使用 JProfiler 进行性能测试

SpringBoot 如何使用 JProfiler 进行性能测试 在 SpringBoot 应用程序中&#xff0c;我们可以使用 JProfiler 进行性能测试。JProfiler 是一款专业的 Java 性能分析工具&#xff0c;可以帮助我们识别和解决应用程序的性能问题。使用 JProfiler 可以让我们更加准确地测试代码的…

C语言进阶教程(字符串深入)

文章目录 前言一、字符数组赋值注意事项二、混淆点三、字符串字面量和字符数组的区别四、字符串长度总结 前言 其实在C语言中是没有真正的字符串的&#xff0c;在C语言中字符串都是使用字符数组来完成的。 一、字符数组赋值注意事项 在C语言中&#xff0c;字符数组&#xff…

[RocketMQ] Producer生产者启动源码 (五)

DefaultMQProducer的关系图: 文章目录 1.创建DefaultMQProducer实例2.start启动生产者2.1 getOrCreateMQClientInstance获取或者创建MQClientInstance2.2 registerProducer注册生产者2.3 start启动MQClientInstance2.4 startScheduledTask启动各种定时任务2.4.1 updateTopicRou…

【Linux】切换内核版本(Centos)

1.查看服务器已安装的所有内核版本 awk -F\ $1"menuentry " {print i " : " $2} /etc/grub2.cfg0 : CentOS Linux (3.10.0-1160.83.1.el7.x86_64) 7 (Core) 1 : CentOS Linux (3.10.0-1160.80.1.el7.x86_64) 7 (Core) 2 : CentOS Linux (3.10.0-1127.el7.…

求最小函数依赖集(例题讲解)超详细,易理解

在关系R<U,F>中&#xff0c;UABCDEG F{BG->C&#xff0c;BD->E,DG->C,ADG->BC,AG->B,B->D} 先进行第一大步&#xff1a; 先看右边&#xff1a; 如果有BG->C,G-->C,因为单G就可以推出C了就不需要BG--->C了&#xff0c;可以把BG--->C这个…

Segment Anything Model(SAM)

Segment Anything Model&#xff08;SAM&#xff09;是Facebook Research近来开源的一种新的图像分割任务、模型。Segment Anything Model&#xff08;SAM&#xff09;可以从输入提示&#xff08;如点或框&#xff09;生成高质量的对象掩模&#xff0c;并可用于生成图像中所有对…

1、一条 SQL 查询语句是如何执行的?

基础篇 第一课、一条 SQL 查询语句是如何执行的&#xff1f; 下面是 MySQL 的基本架构示意图&#xff0c;从中可以清楚地看到 SQL 语句在 MySQL 的各个功能模块中的执行过程。 大体来说&#xff0c;MySQL 可以分为 Server 层和存储引擎层两部分。 Server 层包括连接器、查询缓存…

AI近十年盘点:纵览AI发展历程,探寻AI未来走向

编者按&#xff1a;当我们回顾过去十年的人工智能发展历程时&#xff0c;可以看到一场现在还正在进行的变革&#xff0c;对我们的工作方式、商业运营模式和人际交往行为都产生了深远的影响。从2013年的AlexNet到变分自编码器&#xff0c;再到最近的生成式大模型&#xff0c;人工…

Vue 2 - 常见面试题汇总大全

文章目录 一 基础知识1.vue 的生命周期1-1 钩子函数1-2 钩子函数的使用方法1-3 父子组件生命周期构造函数执行顺序 2 v-show 与 v-if v-for2-1.v-show 与 v-if 的区别2-2 v-if 和v-for的优先级 3.组件通信有哪些方式&#xff1f;4 computed和watch &#xff0c;有什么区别4-1.c…

西门子S7-1200定时器

一、西门子S7-1200定时器介绍 S7-1200的定时器为IEC定时器&#xff0c;用户程序中可以使用的定时器数量仅仅受CPU的存储器容量限制。 使用定时器需要使用定时器相关的背景数据块或者数据类型为IEC_TIMER&#xff08;或TP_TIME、TON_TIME、TOF_TIME、TONR_TIME&#xff09;的D…

别再弄混流程挖掘、BPM和BI

信息时代以来&#xff0c;各类信息系统不仅在企业中得到了广泛的应用和普及&#xff0c;种类和选择伴随全球数字技术的发展也逐渐变得丰富多样。而随着数字化转型的不断深入&#xff0c;企业对系统管理的需求面临着全新的变化。 如何配置最适合当下业务的系统&#xff1f;这个…

Axure教程——图片轮播(纵向滚动)

本文介绍的时用Axure中的动态面板制作图片轮播之纵向滚动 一、预览效果 预览地址&#xff1a;https://c1s4i1.axshare.com 二、功能描述 图片纵向自动滚动播放 三、元件制作 拖入一个动态面板&#xff0c;命名为1&#xff0c;设置大小为375*155&#xff0c;并设置四个状态&…