本帖最后由 RarityEG 于 2021-9-4 23:05 编辑 
42s
致新人:可先阅读 https://www.mcbbs.net/thread-1249960-1-1.html
PART 1 Minecraft 有多大?
 
 
就知道你们不会信,看图

PART 2 你的网速有多快?

PART 3 为什么没有那么快?
不排除启动器希望你多使用它一段时间,但实际上这是有原因的,这就是小文件效应,或者叫 碎片文件效应(名字是我取的没错):
来分析一段 Alicorn 的源代码就知道了:
(强烈要求 Discuz 改进编辑器)
对于每个文件,我们都要进行:
这就导致很多时间浪费在了中间这些操作上,特别是有些启动器使用多线程进行下载,结果导致 CPU 消耗更多的时间在切换上而不是 IO 上。

PART 4 Alicorn 是怎么做到的?
 
 
本小马的电脑就长这样,没什么特别的,真的(
这是在 Alicorn AppleSauce(测试版本)Core 18 上完成的,关闭了 Web 缓存,使用一个空的 MCX 容器。
Timing 的时间所指的是净下载时间,包括核心安装,不包括帐户验证或者本小马操作时间。
文件校验关闭,并发数是 500,不保持连接。
Google 的秒表,加上我的反应时间,误差不超过 2.5s。
事实上,Alicorn 之前使用 Got 作为请求库(也是 electron/get 使用的),可以达到 1min 26s(历史最高)的速度,但是相比其它启动器,虽然不是太慢,但是也只是勉强稍微快一点点(大概几秒吧),这在其它平台上已经很好了(考虑到 .NET 糟糕的 IO),但是对于 Node,这只能说明一个问题:本小马就是菜 Node 的潜力还没有被完全发挥出来。
后来我试遍了 NPM 上许多的 HTTP 库,包括 superagent, axios, needle, minipass-fetch, simple-get, undici,甚至 Node 原生 http,速度不尽相同……
但是总是无法进入一分钟以内啊!!!!!!!
后来我发现了一个简单的解决方法:fetch,就是 Web fetch。这个 API 虽然看上去平平无奇,但是正是它创造了奇迹!
fetch 是 XMLHttpRequest 的替代品,而且具有更高的性能,我居然忽略了这个最容易使用的 API(用蹄蹄捶脑袋
Chromium 是许多顶尖工程师的智慧结晶,他们使用原生代码实现的 fetch 肯定比我写出来的代码要快啊(事实也是这样。
So that's it,我将 Alicorn 内大部分的网络请求换成了 fetch,事实证明,效果也很不错。带来的不仅是下载速度的提升,Alicorn 整体也会变得更快。
(具体表现就是点击「版本选择」的时候菜单弹出更快了之类的……(
@PLAIN_SHEEP @青蛙的名单 @振翮高飞 @bleake @洞穴夜莺 @wine毛毛 @Jaanai @dengyu @Wudji @LeoPro @尸先peng @叉烧 @whatfilmae @xmdhs @⚡️👮 @🐦💕🌸🌸 @天空ag (排名不分先后)
Rock With Us! 一起来玩!
加入我们的 Discord 聊天,随时跟进最新的开发进度哦!https://discord.gg/csGgQgXhZk
或者,如果你还在寻找一个合适的启动器,今天就开始使用 Alicorn 吧!https://www.mcbbs.net/thread-1249960-1-1.html
资深的开发人员或许会觉得我的代码太烂了,请您指教:https://github.com/Andy-K-Sparklight/Alicorn
42s
—— Alicorn 文件下载时间
致新人:可先阅读 https://www.mcbbs.net/thread-1249960-1-1.html
各位 Minecraft 玩家,Alicorn 用户,自由软件支持者,你们好~
你的启动器最近还好吗?哦,Alicorn 用户不要骂我,我知道我不小心弄错了几个小版本(,不过我和大家一样,都在用着自己最喜欢的启动器。
今天我们要讨论的是一个严肃的话题:速度。事实上,我们指的是游戏资源的下载速度。
各位人才,最后面有彩蛋!另外回帖有奖!
PART 1 Minecraft 有多大?
Minecraft 不是一个很小的游戏,事实上,Minecraft 的大小高达 403.8 MB!仅仅一个核心和它的相关文件!
(通常文件会比这更大,本小马用来玩 Bilicraft 的文件夹已经达到了 1.9 GB)
就知道你们不会信,看图

PART 2 你的网速有多快?
一般情况下,现在的百兆网卡理论上可达最高 14 MB/s 的传输速度,然而,由于你的电脑经常需要互联网连接,往往达不到这个速度,常见的速度是 11 MB/s,
如果保持这个速度下载,下载 Minecraft 需要 36.71 秒。
同时,下载的文件不可能保存在内存里,按照最高速度估计,一般固态硬盘的写入速度是 300 MB/s,而机械硬盘是 80 MB/s。
本小马没有钱(快为我发电),所以必须把有限的固态硬盘空间留给更重要的软件,Minecraft 被存储在我的机械硬盘中。
所以,下载的文件需要的写入时间是:5.05 秒。因此,在本小马的电脑上,下载 Minecraft 大约需要 40 秒(如果考虑并行其实可以更短)。
这表明,如果尽可能地使用带宽和硬盘,你需要三十多秒才能完成 Minecraft 的下载。

PART 3 为什么没有那么快?
看了上面所说的,或许你已经发现了:你的启动器通常达不到这个速度。
IO 设备在处理多个小文件时,通常比处理总大小相同的一个大文件要慢很多。
来分析一段 Alicorn 的源代码就知道了:
| const r = await fetch(meta.url, { method: "GET", signal: ac.signal, keepalive: true, }); sti(); const f = getFileWriteStream(meta.savePath); if (r.body) { await r.body.pipeTo(f); } else { throw "Body is empty!"; } | 
(强烈要求 Discuz 改进编辑器)
对于每个文件,我们都要进行:
- 建立连接
- 等待请求
- 打开文件
- 传输和写入
- 关闭(未列出)
 
这就导致很多时间浪费在了中间这些操作上,特别是有些启动器使用多线程进行下载,结果导致 CPU 消耗更多的时间在切换上而不是 IO 上。

PART 4 Alicorn 是怎么做到的?
本小马的电脑就长这样,没什么特别的,真的(
这是在 Alicorn AppleSauce(测试版本)Core 18 上完成的,关闭了 Web 缓存,使用一个空的 MCX 容器。
Timing 的时间所指的是净下载时间,包括核心安装,不包括帐户验证或者本小马操作时间。
文件校验关闭,并发数是 500,不保持连接。
Google 的秒表,加上我的反应时间,误差不超过 2.5s。
事实上,Alicorn 之前使用 Got 作为请求库(也是 electron/get 使用的),可以达到 1min 26s(历史最高)的速度,但是相比其它启动器,虽然不是太慢,但是也只是勉强稍微快一点点(大概几秒吧),这在其它平台上已经很好了(考虑到 .NET 糟糕的 IO),但是对于 Node,这只能说明一个问题:
后来我试遍了 NPM 上许多的 HTTP 库,包括 superagent, axios, needle, minipass-fetch, simple-get, undici,甚至 Node 原生 http,速度不尽相同……
但是总是无法进入一分钟以内啊!!!!!!!
后来我发现了一个简单的解决方法:fetch,就是 Web fetch。这个 API 虽然看上去平平无奇,但是正是它创造了奇迹!
fetch 是 XMLHttpRequest 的替代品,而且具有更高的性能,我居然忽略了这个最容易使用的 API(用蹄蹄捶脑袋
Chromium 是许多顶尖工程师的智慧结晶,他们使用原生代码实现的 fetch 肯定比我写出来的代码要快啊(事实也是这样。
So that's it,我将 Alicorn 内大部分的网络请求换成了 fetch,事实证明,效果也很不错。带来的不仅是下载速度的提升,Alicorn 整体也会变得更快。
(具体表现就是点击「版本选择」的时候菜单弹出更快了之类的……(
@PLAIN_SHEEP @青蛙的名单 @振翮高飞 @bleake @洞穴夜莺 @wine毛毛 @Jaanai @dengyu @Wudji @LeoPro @尸先peng @叉烧 @whatfilmae @xmdhs @⚡️👮 @🐦💕🌸🌸 @天空ag (排名不分先后)
Rock With Us! 一起来玩!
加入我们的 Discord 聊天,随时跟进最新的开发进度哦!https://discord.gg/csGgQgXhZk
或者,如果你还在寻找一个合适的启动器,今天就开始使用 Alicorn 吧!https://www.mcbbs.net/thread-1249960-1-1.html
资深的开发人员或许会觉得我的代码太烂了,请您指教:https://github.com/Andy-K-Sparklight/Alicorn
Alicorn Launcher TECHNOLOGY
彩蛋/各位笑笑就好:| 您可以自由地…… 
 惟须遵循如下条件…… 
 如果嘲笑者挖苦自由、讽刺社区……如果「顽固的现实主义者」说利益是唯一的理想……只需忽略他们,并一如既往地使用 Copyleft。 | 
话说能不能介绍一下这个API和其他API下载文件时行为的不同?
洞穴夜莺 发表于 2021-9-4 22:55
话说能不能介绍一下这个API和其他API下载文件时行为的不同?
fetch 是 Native 代码,在调用层我们看来没什么不同(
主要是性能问题,Got axios 之类的最后都是调用 Node.js 的 http 内置库,不知道为什么,那个的速度并不快(
而 fetch 是纯的原生代码,在浏览器内实现的
(也可能 DOM 的 WritableStream 快一些??(不太清楚
不明觉厉,感觉好像挺牛
 
当然是因为这个是米国的服务器,外加速度不错的 ssd(2.68 美元 120 天
 
另外硬盘读写的话,听说虽然 node.js 不会被堵塞,但是多线程写硬盘还是会更快一些的。
有什么奖励呢
…说啥好呢?HMCL明日黄花(
虽然今天斥巨资2宝石开了一个小组暂时还有点心痛但是仍要表示支持一下!
牛,这就是程序员吗
所以。。。这个和普通的第三方启动器有什么区别?
搞半天才连上网的我是屑
我对启动器只有三个简单的要求
1.能用
2.界面简洁
3.支持外置登录
其他我不管,下载速度只是时间问题(我家网本来就不好,下载慢习惯了
1.能用
2.界面简洁
3.支持外置登录
其他我不管,下载速度只是时间问题(我家网本来就不好,下载慢习惯了
xmdhs 发表于 2021-9-4 23:15
当然是因为这个是米国的服务器,外加速度不错的 ssd(2.68 美元 120 天
你看嘛你的带宽 1840.83 Mbps(
我的才 100(
如果用 Alicorn 的实现,大概率在十几秒内(甚至更短
我那又老又破的机械硬盘……
PLAIN_SHEEP 发表于 2021-9-4 23:46
我对启动器只有三个简单的要求
1.能用
2.界面简洁
(看来我并没有满足第二条……?
行吧,会改的(
(只需要重新实现一个前端
(诸如 DM 之类的
但是不管怎么样,快一点总没什么坏处(
懂了,我去玩HMCL了
RarityEG 发表于 2021-9-4 23:46
你看嘛你的带宽 1840.83 Mbps(
我的才 100(
如果用 Alicorn 的实现,大概率在十几秒内(甚至更短
因为单个文件并没有使用多线程下载。
另外,网速快你也不一定可以全用上哦,服务器可以限制连接数以及下载速度。
茶馆水贴x
打广告√
打广告√
xmdhs 发表于 2021-9-4 23:15
当然是因为这个是米国的服务器,外加速度不错的 ssd(2.68 美元 120 天
我可能有台同机房的
 
然后速度是
 
但是我猜这两台vps瓶颈应该都是cpu……
(啊这(Linux系统(
。—。 发表于 2021-9-5 09:11
我可能有台同机房的
然后速度是
(服务器级别的IO,和本小马的桌面电脑哪是一个量级的(
(不过看上去你的偏向于上行而不是下行(本来服务器也是这样的)
CPU的话,不太清楚Go的消耗,但是反正如果处理得好,Node 是不会占用太多的(2.9GHzx1足够了)
油迹君 发表于 2021-9-5 09:11
(啊这(Linux系统(
(Windows就是屑(
(Alicorn在macOS的速度会有所降低,在Windows上会大打折扣(-20%~-30%吧)
而且不光是Alicorn,像是IDEA,Minecraft这种消耗很多资源的,都会慢不少
(当然可能受硬件影响,其它电脑或许差距没这么多
RarityEG 发表于 2021-9-5 09:22
(Windows就是屑(
(Alicorn在macOS的速度会有所降低,在Windows上会大打折扣(-20%~-30%吧)
而且不光 ...
(我不懂(阿巴阿巴
(我只知道我steam速度只有2mb/s(呜呜
这就叫管理评宝石
虽然有点懵,但是我还是想说谢谢大佬(
太强了吧 大佬nb
加油,已经开始用这个启动器了qwq
我现在每次看到最后的条款都会自动翻译出人话版本
另外,是不是有奇怪的东西混入其中了
另外,是不是有奇怪的东西混入其中了
牛蛙牛蛙 膜拜大佬
。—。 发表于 2021-9-5 09:11
我可能有台同机房的
然后速度是
下载时 tls 的解密倒还好,主要是下载后会校验 sha-1,所以会消耗不少 cpu。
当然,如果有多核也是可以利用上的。
我是否可以理解为alicorn通过优化请求库来缩短响应时间?
(并没有看懂这个帖子的主题。。。)
 
 
 
