Skip to content

实时速率固定宽度,延迟图表加削峰 - #4

Merged
stqfdyr merged 5 commits into
mainfrom
feat/stable-rates-and-despike
Sep 20, 2026
Merged

stqfdyr merged 5 commits into
mainfrom
feat/stable-rates-and-despike

Conversation

@stqfdyr

@stqfdyr stqfdyr commented Sep 20, 2026 •

Copy link
Copy Markdown
Contributor

公开页两处:实时速率固定宽度,延迟图表加削峰开关。

  • 实时数字放进按最宽形态预留的槽位(compact 5.6ch、bytes 7.3ch、rate 10.2ch,按最宽的 MB 形态量),右对齐,宽度不再随量级变化。用在摘要行、表格网速列、展开详情的网速行;手机版网速列只有 60px,放不下两个槽位加分隔符的 70px,那里不预留。
  • 延迟图表加削峰开关,默认关。format.ts 的 despike,Hampel 滤波:偏离窗口中位数超过 3 倍稳健差的样本换成该中位数,持续一段时间的变化保持原高度。
  • 绝对中位差下限取 1 ms。延迟是整毫秒,稳定线路的窗口中位差为 0,不设下限时滤波在平直线路上完全不生效。
  • 窗口按时长折算而非固定样本数。桶的间隔由视口决定,固定 7 个样本会让同一次五分钟卡顿在桌面被当成尖峰削掉、在手机被当成持续保留。
  • 两侧都削:孤立的异常快同样把自适应的轴拉开,实测一个这样的桶把轴从 150–480 ms 拉到 0–600 ms。
  • 单探测画出的 band 与线一起削,否则轴仍被尖峰撑开;带取线与上下沿三者的跨度,两条边各自过滤会得到倒置的区间;tooltip 取整,被替换的样本带的是偶数窗口的中位数。
  • 详情里今日 / 本月 / 总流量三行未做预留,它们的宽度变化是分钟级的。

tsc -b、oxlint、npm test、npm run build 通过。浏览器实测:四种量级下摘要行、总流量、网速列三处坐标完全不变;320 / 360 / 390px 下网速列不再被旁边的进度条截断;削峰在双探测与单探测(带 band)下把轴从 2400 ms 收到 480 ms。同一滤波在默认主题的失效见 monitor-probe/monitor-theme-default#3。

网速由 compact / bytes / rate 格式化,宽度随量级变化(compact 最窄 "0B" 2.2ch、
最宽 "1023M" 5.49ch),每次推送整行都会重新排版:摘要行的左边界实测在 526 与
573 之间来回,表格网速列在 845 与 854 之间。

改为把每个实时数字放进按最宽形态预留的槽位,右对齐,单位因此不动而数字向箭头
方向生长。槽宽用 ch,即等宽数字下一个数字的宽度,跟随字号,手机上 10px 同样成立。
四种量级的速度下,摘要行、总流量、网速列三处的坐标完全不变。
一个 2 秒的桶会把 24 小时的轴撑到 2200ms,其余部分压成一条平线。加 Hampel
滤波(format.ts 的 despike):偏离窗口中位数超过 3 倍稳健差的样本换成该中位数,
其余原样通过,所以持续一段时间的高延迟保持原高度,只有孤立的尖峰被拉回。

绝对中位差下限取 1 ms,即延迟存储的分辨率。不设下限时,稳定线路的窗口内多数
样本是同一个整数,中位差正好为 0,判据要么什么都不削、要么把非中位数的样本全削
掉——两种都恰好在削峰唯一要处理的形状上失效。

单探测时画出的 band 与线共享同一批离群点,且轴是按它拟合的,所以一并削:实测
24 小时窗,削峰前轴顶 2400ms,只削线不削 band 仍是 2400ms,两者都削后为 480ms。
被替换的样本带的是偶数窗口的中位数,落在两个整毫秒之间,tooltip 会显示 180.5 ms 这种值。
三处 review 发现:

窗口此前固定 7 个样本,而桶的间隔由视口决定(请求的 points 是 innerWidth ×
devicePixelRatio),同一个 24 小时窗在桌面是一分钟一桶、在手机是两分钟一桶,于是
同一次五分钟的卡顿在桌面被当成尖峰削掉、在手机被当成持续保留。改为按探测自己的最小
桶间隔折算成七分钟,取奇数并夹在 3 到 15 之间。

削峰对两侧都生效,而开关的说明只写了「高延迟」。孤立的异常快同样会把自适应的轴拉开
——实测一个这样的桶把轴从 150-480 ms 拉到 0-600 ms——所以改的是说明而不是算法。

网速列在手机版是面板宽度的 21%,320px 下只有 60px,而两个槽位加分隔符要 70px,超出
的部分被旁边的进度条盖住,常见值也会被截掉半截。该列在 @max-3xl 下不再预留;槽宽因此
改由自定义属性传递,行内样式盖不住类。
带的上下沿是各自过滤的,一个比平时快一点的桶会只触发下沿:实测
[180,181,180,180,176,180,181,180,180] 这条线得到 [180, 178],区间倒置、线还落在
区间外。改为取线与上下沿三者的跨度。

槽宽此前按 "1023 GB" 与 "1023.0 KB/s" 量,而 M 是最宽的单位字母:"1023 MB" 是
7.19ch、"1023.0 MB/s" 是 10.09ch,都超过原来的 7.2 与 9.9。改按 MB 形态取值。

despikeWindow 的返回值原本叫 window,遮蔽了全局的 window;本文件在 useHistory 里
特意用 globalThis 取全局属性,正是为了避开这个名字。
@stqfdyr
stqfdyr merged commit 9233545 into main Sep 20, 2026
1 check passed
@stqfdyr
stqfdyr deleted the feat/stable-rates-and-despike branch September 20, 2026 04:53
stqfdyr added a commit that referenced this pull request Sep 23, 2026
#7 在改到期天数时连带删掉了 #4 的 `Num` 槽位,摘要行、表格网速列、展开详情的网速行的数字又随量级改变宽度。

- 恢复 `SLOT` 与 `Num`,三处重新按最宽形态预留宽度、右对齐;手机版网速列仍不预留
- 到期天数照旧由 `expiresIn` 给出
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant