下载进度条的原理

共 2319字,需浏览 5分钟

 ·

2021-12-19 08:14


点击上方 蓝字 关注我们!



2021 最新 Java 编程资料免费领!Java 视频教程,Java Web 项目教程,互联网Java 面试真题 / 算法题,简历模板,Linux 服务器等等,点击领取

来源:网络


下载最怕什么,那绝对是进度条:99%


这是一个充满魔力的数字,曾让我狂躁、焦虑,甚至激动得想砸键盘锤电脑扔手机。



比如下载学习资料或看动作大片,苦苦等待2小时,好不容易下到99%,以为2秒后就能享受大片的美妙,步入极乐世界。


结果半小时过去了,进度条死死卡在99%,任你千兆光纤,专线宽带,愣是一丝不动,稳如泰山。



再去检查路由器,狂按重启键,发现网络一切正常,网页秒开,唯独进度条上的99%永恒不变。


即使你重启电脑,重新打开下载软件,重新开始那99%的下载任务,它依旧还是99%,不增不减。


你不禁开始疑惑:为什么进度条总要卡在99%?为什么最后1%永远加载不动?


今天,要为大家破解这一千古谜题,揭开背后不可告人的真相。


# 技术原理导致


关于进度条99%的问题,得从它的诞生说起。


1896年,波兰经济学家Karol Adamiecki制作了一种名叫时间表的图,提出了早期的进度条概念,但是当时没有具体的应用。


等到1979年,这哥们Mitchell Model在他的博士论文中提出了进度条。


论文里他表示:进度条能在复杂的计算机环境中监视系统行为。


说白了就是:进度条能直观展现电脑在做什么,做到哪种程度。



正因为进度条能用最简单的图案和数字,表达电脑复杂的计算过程的特性,于是渐渐在各大操作系统流行起来,成为了电脑的经典标志之一。


但问题来了,人不是电脑更不是神,再牛X的程序员也无法预测电脑什么时候完成工作。


所以程序员开发出来的进度条,根本不能精准地反映出电脑情况,所谓的50%、80%、90%,仅是大概的数字,预测而已。


可以说你看到的进度条,和实际的进度是两个东西。




对于一些可定量的项目,进度条基本可以和实际相符,但不同的硬件资源和后台程序都会相互占据资源,计算机很难恒定分配运行,当你影片下载到99%时又打开了大型游戏,或者哪个小任务卡住了,就到了艰难的「1%时刻」。


其实这种1%随时都在发生,但我们只对最后的1%印象深刻。



它有时候前面很快,后面很慢。


就像U盘复制文件,系统会根据文件数量和传输速度算好大概时间,但并不是每个百分比都执行相同的工作,因为每个文件大小都不一样,而最后1%可能因为还要验证文件、全盘扫描、整理数据等等,所以耗时也最久。



它也可能一直不快不慢,因为它整条都是假的。


虽然卡在99%的等待并不让人愉快,但也不得不承认,没有0%到99%,我们的情绪会更焦躁,因为不知道尽头在哪里。


这就是进度条的厉害之处——让你心甘情愿地等待。



# 产品经理的恶意


1985年,卡内基梅隆大学人机交互研究所教授Brad Myers还是一位研究生,当时他就在论文里提出了这个观点:


只要看到进度条,人们就会感觉好点,它能让人放松,让人在等待时间去干点别的——去花5分钟发个传真,或者干些在1985年的办公室会干的事。


虽然进度条由程序员开发,但真正设计进度条的人,是产品经理,包括功能、样式、图案等。


很多产品经理在设计进度条时,会特意要求程序员制作一个“虚假进度条”。


可能你会问,产品经理为什么无缘无故搞个假东西骗人呢?


给你们举个栗子,看完就懂了。


假设现在有2个相同下载速度的进度条,A和B,它们的下载完成时间都是100秒。



A是经过产品经理特殊调教的虚假进度条,它很套路,用了20秒下载到99%,最后1%花了80秒完成。


B是老实进度条,没被调教,10秒加载到10%,100秒100%,一分不差。


此时因为A前十秒加载到99%,而同样时间B却仅有10%,在强烈的对比下,大部分人会认为A比B更快,A比B更好用。


在优胜劣汰的规则下,用户肯定更多会选择A这种方式的软件,而产品经理想要留住用户,采用这种虚假进度条那是必须的。



现在明白了吧,有时候不是进度条不准,而是产品经理在搞事。


# 下载完成后的块校验


根据我多年的经验,导致这种情况发生的原因主要还是因为资源****块校验的机制。



迅雷下载采用P2P协议加速,P2P的优点在于有多个数据来源。


每个下载过该文件的人,相当于一台服务器,当别人下载时自动在后台上传数据,提供速度。


说白了就是下的人越多,你所下载的资源能被拼凑时间越短。


但缺点同样也有,因为数据来源多,质量参差不齐外加上传不稳定,容易导致文件乱码出错。


因此迅雷定下了一个规则:在下载到99.9%的时候,会对文件进行块检验,如果某个块出现问题,无法重新下载,则会一直卡在当前进度不动。


下面这个图很好的说明了问题:



兄弟你的形状怎么跟我们不一样啊?


如果哪天卡在99.9%不动,别傻楞去充白金会员,大声告诉你:钛金会员都没用!

往期推荐

如果打工人嫖娼被抓无法上班,是否能算旷工?

推荐:Spring Cloud 整合 Nacos 实现服务配置中心

二十年老程序员的二十条心得:警惕很久没写过代码的“大牛”

8 张漫画图解单点登录系统

Java 泛型通配符详解


END



若觉得文章对你有帮助,随手转发分享,也是我们继续更新的动力。


长按二维码,扫扫关注哦

「C语言中文网」官方公众号,关注手机阅读教程 


学习资料包括: Java,算法,数据库,Linux,简历,运维 等编程分类,在不断更新中哦


点击“阅读原文”,马上免费领取!
👇👇👇

浏览 134
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报