ARSpark
本帖最后由 RarityEG 于 2021-9-4 23:05 编辑

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,这只能说明一个问题:本小马就是菜 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
新一代启动器 - 你的游戏助理
更敏捷,更灵活,更自由
8 分钟,从认识到启动
和 Alicorn 一起,改变世界,点此以开始。

彩蛋/各位笑笑就好:

   本文采用了「GNU 自由文档许可证」进行授权

       您可以自由地……
  • 你可以复制或发布文件于任何媒体,而不论其是否具有商业买卖行为。
  • 你可以复制和发布文件的修改版本。
         只要您遵循许可条款,许可人就无法收回您的这些权利。

       惟须遵循如下条件……
  • 你不可以在本授权下再设置额外条件的次授权或发布文件,除非明白地表示是在本授权所规范的条件下进行。
  • 你不可以妨碍或控制你所制作或发布的拷贝阅读或进一步的发布。
  • 文档不提供任何保障,由文档本身带来的一切后果与潜在风险,您同意作者不负任何责任。
  • 请注意:本文欢迎「宝石」或任何等价评分,因为这是您的自由,虽然看上去,在本版你不能评分宝石。
  • 不得要求其他人不对复制和/或修改后再发布的作品评分「宝石」或任何等价评分,并且再发布版本也需要添加这一要求。

如果嘲笑者挖苦自由、讽刺社区……如果「顽固的现实主义者」说利益是唯一的理想……只需忽略他们,并一如既往地使用 Copyleft。






洞穴夜莺
话说能不能介绍一下这个API和其他API下载文件时行为的不同?

ARSpark
洞穴夜莺 发表于 2021-9-4 22:55
话说能不能介绍一下这个API和其他API下载文件时行为的不同?

fetch 是 Native 代码,在调用层我们看来没什么不同(
主要是性能问题,Got axios 之类的最后都是调用 Node.js 的 http 内置库,不知道为什么,那个的速度并不快(

而 fetch 是纯的原生代码,在浏览器内实现的
(也可能 DOM 的 WritableStream 快一些??(不太清楚

KevinKwok
不明觉厉,感觉好像挺牛

xmdhs


当然是因为这个是米国的服务器,外加速度不错的 ssd(2.68 美元 120 天



另外硬盘读写的话,听说虽然 node.js 不会被堵塞,但是多线程写硬盘还是会更快一些的。

dear龙龙君
有什么奖励呢

Na2O2
…说啥好呢?HMCL明日黄花(

青蛙的名单
虽然今天斥巨资2宝石开了一个小组暂时还有点心痛但是仍要表示支持一下!

ZHOURoman
牛,这就是程序员吗

changfeng_ng
所以。。。这个和普通的第三方启动器有什么区别?

heiheilq
搞半天才连上网的我是屑

SHEEP_PLAINS
我对启动器只有三个简单的要求
1.能用
2.界面简洁
3.支持外置登录

其他我不管,下载速度只是时间问题(我家网本来就不好,下载慢习惯了

ARSpark
xmdhs 发表于 2021-9-4 23:15
当然是因为这个是米国的服务器,外加速度不错的 ssd(2.68 美元 120 天

你看嘛你的带宽 1840.83 Mbps(
我的才 100(
如果用 Alicorn 的实现,大概率在十几秒内(甚至更短
我那又老又破的机械硬盘……

ARSpark
PLAIN_SHEEP 发表于 2021-9-4 23:46
我对启动器只有三个简单的要求
1.能用
2.界面简洁

(看来我并没有满足第二条……?
行吧,会改的(
(只需要重新实现一个前端
(诸如 DM 之类的
但是不管怎么样,快一点总没什么坏处(

changfeng_ng
懂了,我去玩HMCL了

xmdhs
RarityEG 发表于 2021-9-4 23:46
你看嘛你的带宽 1840.83 Mbps(
我的才 100(
如果用 Alicorn 的实现,大概率在十几秒内(甚至更短

因为单个文件并没有使用多线程下载。

另外,网速快你也不一定可以全用上哦,服务器可以限制连接数以及下载速度。

寂华
茶馆水贴x
打广告√

ARSpark
寂华 发表于 2021-9-5 00:10
茶馆水贴x
打广告√

(既然都已经点进来了…何不多看两眼,点几个链接之类的(疯狂暗示

。—。
xmdhs 发表于 2021-9-4 23:15
当然是因为这个是米国的服务器,外加速度不错的 ssd(2.68 美元 120 天

我可能有台同机房的

然后速度是

但是我猜这两台vps瓶颈应该都是cpu……

暮暮的猫猫
(啊这(Linux系统(

ARSpark
。—。 发表于 2021-9-5 09:11
我可能有台同机房的

然后速度是

(服务器级别的IO,和本小马的桌面电脑哪是一个量级的(
(不过看上去你的偏向于上行而不是下行(本来服务器也是这样的)
CPU的话,不太清楚Go的消耗,但是反正如果处理得好,Node 是不会占用太多的(2.9GHzx1足够了)

ARSpark
油迹君 发表于 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(呜呜

⚡️👮
Minecraft本体这么大吗(

whatfilmae
这就叫管理评宝石

FluffiLyn_茸锂
虽然有点懵,但是我还是想说谢谢大佬(

ARSpark
⚡️👮 发表于 2021-9-5 09:48
Minecraft本体这么大吗(

(你才发现)
如果算上JRE,还要多50M(

ARSpark
whatfilmae 发表于 2021-9-5 10:01
这就叫管理评宝石

(然后拿去换贡献(

(此帖已严重逻辑混乱(

WD17
太强了吧 大佬nb

Naruanoad
加油,已经开始用这个启动器了qwq

Piglin_42313
我现在每次看到最后的条款都会自动翻译出人话版本
另外,是不是有奇怪的东西混入其中了

ARSpark
Piglin_42313 发表于 2021-9-5 10:31
我现在每次看到最后的条款都会自动翻译出人话版本
另外,是不是有奇怪的东西混入其中了 ...

(?
(什么奇怪的东西啊(

Piglin_42313
RarityEG 发表于 2021-9-5 10:33
(?
(什么奇怪的东西啊(
请注意:本文欢迎「宝石」或任何等价评分,因为这是您的自由,虽然看上去,在本版你不能评分宝石。

强烈暗示(雾


pick.momo
牛蛙牛蛙 膜拜大佬

xmdhs
。—。 发表于 2021-9-5 09:11
我可能有台同机房的

然后速度是

下载时 tls 的解密倒还好,主要是下载后会校验 sha-1,所以会消耗不少 cpu。

当然,如果有多核也是可以利用上的。

振翮高飞
有点超出我的知识水平范围了
我是否可以理解为alicorn通过优化请求库来缩短响应时间?
(并没有看懂这个帖子的主题。。。)

ARSpark
振翮高飞 发表于 2021-9-5 11:38
有点超出我的知识水平范围了
我是否可以理解为alicorn通过优化请求库来缩短响应时间?
(并没有看懂 ...

(本小马的帖子一向没有主题(

金色的柠檬
当我看到这个帖子的时候,我还以为这里是软件资源

mc_lenmo
我是**我看不懂

振翮高飞
RarityEG 发表于 2021-9-5 11:39
(本小马的帖子一向没有主题(

?。。。
好吧,前天我在虚拟机里下载.jar文件直接下载失败了,明天再试
u1s1,感觉我对Ubuntu仍然不怎么熟
但使用体验感觉不错
(据网上说libreoffice对msoffice兼容不佳是真的吗)

东皮
看了半天
我懂了
这是一个宣传自家启动器的
不过为啥要这么在意下载游戏的速度

娜塔莉
大佬永远是大佬

寂华
RarityEG 发表于 2021-9-5 09:08
(既然都已经点进来了…何不多看两眼,点几个链接之类的(疯狂暗示


这就去看看(

ARSpark
寂华 发表于 2021-9-5 11:57

这就去看看(

(那图偶尔会有问题(
(毕竟不是论坛图床
主要是不知道为啥,我每次修改就会进审核,所以不敢改(
(不影响阅读……

Mr.Xu
大佬好 ~ 我只是个海王 QAQ 小白表示什么都看不懂

Fro9
谢邀,网速烂,电脑渣,没认真看

⚡️👮
RarityEG 发表于 2021-9-5 10:03
(你才发现)
如果算上JRE,还要多50M(

我一直以为Minecraft本体就几十MB(versions文件迷惑了我

Donistry
我就假装看懂了,然后水个评论

ARSpark
⚡️👮 发表于 2021-9-5 13:21
我一直以为Minecraft本体就几十MB(versions文件迷惑了我

主要是资源文件Assets比较多,确切的数字是2800余个,每个几十到几百K(

最美的爱酱
我不明白 但是大佬牛掰

下一页 最后一页