mirror of
https://github.com/GopeedLab/gopeed.git
synced 2026-11-14 12:23:43 +00:00
research: compare process CPU and memory for moejs workloads
This commit is contained in:
1 parent
941fda7d13
commit
9504e33a44
10 files changed
+7792
-2
No files matched your search
@@ -17,6 +17,8 @@ GOPEED_MOEJS_LIVE=1 go test -run TestLiveResolve -v -timeout 4m
|
|||||||
GOMAXPROCS=1 go test -pgo=off -run '^$' -bench . -benchmem -benchtime=500ms -count=5 -timeout 8m > results/bench.txt
|
GOMAXPROCS=1 go test -pgo=off -run '^$' -bench . -benchmem -benchtime=500ms -count=5 -timeout 8m > results/bench.txt
|
||||||
python3 summarize.py
|
python3 summarize.py
|
||||||
python3 measure_size.py
|
python3 measure_size.py
|
||||||
|
# macOS/Linux:独立进程的 CPU、峰值 RSS、存活堆和关闭后内存。默认 5 轮。
|
||||||
|
python3 measure_resources.py > results/resources-run.txt
|
||||||
```
|
```
|
||||||
|
|
||||||
`fetch_sources.py` 只取固定提交的原始 `dist/index.js`,校验已记录的 SHA-256,不执行 npm 安装或构建。下载文件和二进制不入库。`results/sources.json` 是来源清单。
|
`fetch_sources.py` 只取固定提交的原始 `dist/index.js`,校验已记录的 SHA-256,不执行 npm 安装或构建。下载文件和二进制不入库。`results/sources.json` 是来源清单。
|
||||||
@@ -32,6 +34,7 @@ python3 measure_size.py
|
|||||||
- `TestAsyncHTTP` 使用本地 HTTP server,验证异步 JSON 和 AbortController 请求取消。
|
- `TestAsyncHTTP` 使用本地 HTTP server,验证异步 JSON 和 AbortController 请求取消。
|
||||||
- `BenchmarkBufferedTransport` 在两个引擎中使用同一段 JS 的 buffered Response,检查速度差是否主要来自原生 Response/Stream 实现。
|
- `BenchmarkBufferedTransport` 在两个引擎中使用同一段 JS 的 buffered Response,检查速度差是否主要来自原生 Response/Stream 实现。
|
||||||
- `BenchmarkExtension/*/cold` 包含建引擎、polyfill、编译和加载完整 bundle、一次 resolve 及关闭;`warm` 复用已加载的 runtime。冷启动更接近当前 `doTrigger` 路径。
|
- `BenchmarkExtension/*/cold` 包含建引擎、polyfill、编译和加载完整 bundle、一次 resolve 及关闭;`warm` 复用已加载的 runtime。冷启动更接近当前 `doTrigger` 路径。
|
||||||
|
- `measure_resources.py` 为每个样本启动独立 worker,交替引擎顺序,以进程 user+system CPU 时间比较相同工作量;另测保留 1/8 个 runtime 的内存。解释与结果见 [RESOURCES.md](RESOURCES.md)。两个引擎都链接在同一个测量程序中,RSS 是原型 worker 的占用,不是最终 Gopeed 应用占用。
|
||||||
- `measure_size.py` 实测独立解释器程序和真实 CLI 的双引擎共存成本;没有伪造“已经完全替换”的安装包大小。CLI 构建可能临时补充本实验 module 的依赖,最后执行 tidy。
|
- `measure_size.py` 实测独立解释器程序和真实 CLI 的双引擎共存成本;没有伪造“已经完全替换”的安装包大小。CLI 构建可能临时补充本实验 module 的依赖,最后执行 tidy。
|
||||||
|
|
||||||
测试只覆盖本报告所列路径。未指定 `GOPEED_MOEJS_LIVE=1` 时,扩展回放不访问外网;固定 bundle 需要事先下载。
|
测试只覆盖本报告所列路径。未指定 `GOPEED_MOEJS_LIVE=1` 时,扩展回放不访问外网;固定 bundle 需要事先下载。
|
||||||
@@ -4,7 +4,9 @@
|
|||||||
|
|
||||||
## 判断
|
## 判断
|
||||||
|
|
||||||
**值得继续做完整宿主移植,但目前不足以批准直接替换生产 goja。**
|
**CPU/内存补测后,建议维持 goja,暂不投入完整替换。**
|
||||||
|
|
||||||
|
新增的 [CPU 与内存测量](RESOURCES.md) 表明:当前冷路径 B 站/YouTube 的实际 CPU 时间只降低约 12% / 15%,驻留内存没有一致改善,连续解析的进程峰值 RSS 还更高。结合迁移成本和包体结果,收益不足以推进替换。
|
||||||
|
|
||||||
三个真实扩展的完整 bundle 已在 moejs 中跑通离线解析和公开网站联网解析,结果与 goja 相同。热运行 CPU 收益明显;当前 Gopeed 的事件路径每次新建引擎、编译并加载 bundle,冷启动的收益远小于热运行倍数。压缩体积基本没有显著收益。
|
三个真实扩展的完整 bundle 已在 moejs 中跑通离线解析和公开网站联网解析,结果与 goja 相同。热运行 CPU 收益明显;当前 Gopeed 的事件路径每次新建引擎、编译并加载 bundle,冷启动的收益远小于热运行倍数。压缩体积基本没有显著收益。
|
||||||
|
|
||||||
@@ -121,6 +123,6 @@ moejs 的 mutable runtime 创建在本机反而明显更贵。shared frozen 模
|
|||||||
1. 在实验构建中跑完整 Downloader → extension → Go task/resource → Blob/FFmpeg/WebView 路径,实测 B 站与 YouTube 下载输出文件、取消、断点恢复、重试;不再依赖本次模拟宿主。
|
1. 在实验构建中跑完整 Downloader → extension → Go task/resource → Blob/FFmpeg/WebView 路径,实测 B 站与 YouTube 下载输出文件、取消、断点恢复、重试;不再依赖本次模拟宿主。
|
||||||
2. 新引擎跑现有扩展、Fetch/Stream、WebView、FFmpeg、事件取消测试;验证无 pending promise、session 泄漏及并发访问错误。
|
2. 新引擎跑现有扩展、Fetch/Stream、WebView、FFmpeg、事件取消测试;验证无 pending promise、session 泄漏及并发访问错误。
|
||||||
3. 在实际每事件新建 runtime 的方式下比较总耗时、CPU、峰值/常驻内存和最终安装包;增加至少一台 Windows、一台 Android/iOS 目标以及真实大型 player/playlist。
|
3. 在实际每事件新建 runtime 的方式下比较总耗时、CPU、峰值/常驻内存和最终安装包;增加至少一台 Windows、一台 Android/iOS 目标以及真实大型 player/playlist。
|
||||||
4. 再决定冷路径与实际解析体验的提升是否足以抵消桥接成本。热 CPU 已有继续投入的依据,**最终包体和完整下载性能目前没有“大幅提升”的证据**。
|
4. 再决定冷路径与实际解析体验的提升是否足以抵消桥接成本。新增资源测量不支持在当前架构下继续完整移植;未来若有真实的长时间计算/环境复用场景,再重新评估。**最终包体和完整下载性能目前没有“大幅提升”的证据**。
|
||||||
|
|
||||||
本 PR 仅交付可复现的调研/原型,不切换默认引擎。生产 engine 原有测试通过,记录在 [production-engine-tests.txt](results/production-engine-tests.txt)。复现命令见 [README.md](README.md)。
|
本 PR 仅交付可复现的调研/原型,不切换默认引擎。生产 engine 原有测试通过,记录在 [production-engine-tests.txt](results/production-engine-tests.txt)。复现命令见 [README.md](README.md)。
|
||||||
@@ -0,0 +1,86 @@
|
|||||||
|
# CPU 与内存补充测量
|
||||||
|
|
||||||
|
日期:2026-11-14。沿用 [主报告](REPORT.md) 的引擎版本、三个固定扩展包、回放输入和 M1 / Go 1.26.0 环境。
|
||||||
|
|
||||||
|
**建议维持 goja,暂不投入完整替换。** 在当前每次事件新建引擎、重新编译加载的方式下,B 站/YouTube 的 CPU 只减少约 12% / 15%,没有一致的内存优势;连续解析时峰值 RSS 更高。Twitter 的 CPU 降幅较大,但每次只省约 5 ms。这些收益不足以抵消完整宿主桥接、兼容性和维护成本。
|
||||||
|
|
||||||
|
## 测量方式
|
||||||
|
|
||||||
|
- 每个样本使用新的独立 OS 进程,两个引擎交替先后顺序,5 轮重复,报告中位数;最终数据共 120 个进程样本。测量时未与本次其他构建或测试并发。
|
||||||
|
- `GOMAXPROCS=1 GOGC=100 GOMEMLIMIT=off`,不使用 PGO。CPU 是 `getrusage(RUSAGE_SELF)` 的 **user + system 时间**,除以完成次数;包含 GC 和编译开销,不使用瞬时 CPU 占用百分比,也不把墙钟耗时直接当 CPU 时间。
|
||||||
|
- `cold`:一次进程内先预热一次全局初始化,再连续完成 20 次“新建环境、克隆 bundle 输入字符串、编译加载、解析、关闭”。接近当前反复触发扩展事件的方式。每次使用独立 bundle 字符串,模拟生产文件读取后的输入所有权。
|
||||||
|
- `warm`:环境已加载,连续解析 200 次。仅用于确认复用环境时的 CPU 上限;当前生产事件路径没有这样复用。
|
||||||
|
- 内存组不预建引擎,从相同测量程序基线开始,分别建立并保留 1 / 8 个完整环境,每个环境执行一次解析后保持存活。8 个环境是同时保留,不是同时并行执行;不模拟实际 Blob/FFmpeg 媒体数据。
|
||||||
|
- 存活堆:`runtime.MemStats.HeapAlloc` 相对建引擎前的增量。连续 GC 并给异步清理调度机会,至少 3 轮、最多 8 轮,直到相邻值差异小于 64 KiB;不稳定则测量失败。保留源字符串并用 `runtime.KeepAlive` 保证环境仍存活,避免编译器提前释放。
|
||||||
|
- RSS:通过 `ps` 记录当前物理驻留快照,通过 `getrusage` 记录进程历史峰值;macOS 的峰值单位为字节,Linux 转换为字节。`ps`、稳定 GC 和内存快照都在计时区间外,`RUSAGE_SELF` 不包括 sampler 子进程 CPU。
|
||||||
|
- 两个引擎链接在相同测量 worker 中,RSS 含公共 Go/测试框架/代码页和 allocator 保留页,**不是完整 Gopeed 应用或最终单引擎产品的内存预测**。存活堆增量用来区分扩展保留对象和进程历史峰值。
|
||||||
|
- 全部输出按 SHA-256 比较一致,没有通过减少文件或请求处理量获得更好的数字。宿主 mock、HTTP fixture、未移植能力及真实下载尚未验证等限制与主报告相同。
|
||||||
|
|
||||||
|
## 冷路径 CPU 与连续解析峰值
|
||||||
|
|
||||||
|
| 扩展 | goja CPU (ms/次) | moejs CPU (ms/次) | CPU 减少 | goja 峰值 RSS (MiB) | moejs 峰值 RSS (MiB) |
|
||||||
|
| --- | ---: | ---: | ---: | ---: | ---: |
|
||||||
|
| bilibili | 118.962 | 104.081 | 12.5% | 154.7 | 172.3 |
|
||||||
|
| youtube | 278.476 | 237.330 | 14.8% | 283.8 | 358.9 |
|
||||||
|
| twitter | 15.555 | 10.594 | 31.9% | 79.7 | 96.8 |
|
||||||
|
|
||||||
|
|
||||||
|
峰值是连续 20 次冷解析期间**整个 worker 的进程峰值**,不是单个 runtime 的堆大小。峰值会受 Go GC/allocator 与异步清理时机影响;不能将它当作关闭后仍存活的对象。原始数据保留每轮值,汇总文件也提供 min/max。
|
||||||
|
|
||||||
|
| 扩展 | goja 累计分配 (MiB/次) | moejs 累计分配 (MiB/次) | 分配减少 |
|
||||||
|
| --- | ---: | ---: | ---: |
|
||||||
|
| bilibili | 73.69 | 60.17 | 18.3% |
|
||||||
|
| youtube | 159.91 | 146.82 | 8.2% |
|
||||||
|
| twitter | 10.96 | 7.73 | 29.5% |
|
||||||
|
|
||||||
|
|
||||||
|
moejs 的累计分配量确实较少,但这没有转化为更低的连续解析峰值 RSS。`B/op`、GC 后存活堆、RSS 是不同指标,不能互相替代。
|
||||||
|
|
||||||
|
## 保留环境时的内存
|
||||||
|
|
||||||
|
| 扩展 | 保留环境数 | goja 存活堆增量 (MiB) | moejs 存活堆增量 (MiB) | goja RSS 快照 (MiB) | moejs RSS 快照 (MiB) |
|
||||||
|
| --- | ---: | ---: | ---: | ---: | ---: |
|
||||||
|
| bilibili | 1 | 15.87 | 15.66 | 114.2 | 111.2 |
|
||||||
|
| bilibili | 8 | 126.72 | 120.60 | 362.0 | 302.6 |
|
||||||
|
| youtube | 1 | 32.48 | 41.22 | 203.7 | 192.2 |
|
||||||
|
| youtube | 8 | 259.64 | 320.54 | 627.8 | 680.1 |
|
||||||
|
| twitter | 1 | 2.53 | 2.63 | 75.6 | 74.7 |
|
||||||
|
| twitter | 8 | 20.06 | 19.48 | 106.9 | 93.5 |
|
||||||
|
|
||||||
|
|
||||||
|
B 站一个环境的存活堆几乎没有变化;YouTube 反而更高。多环境情况下也没有稳定、普遍的显著节省。RSS 快照包含 allocator 页面,因此与存活堆的变化比例不同。
|
||||||
|
|
||||||
|
最初单次 GC 的 YouTube 堆快照约为 32.5 → 42.2 MiB。考虑 moejs 异步清理编译缓存后,已重测驻留组,表中使用稳定 GC 的结果,不能将初始 42.2 MiB 当成最终驻留值。CPU 和冷路径峰值取自第一次进程资源测量;这些计时和峰值发生在强制 GC 之前,不受驻留测量修正影响。
|
||||||
|
|
||||||
|
关闭全部环境并等稳定 GC 后,额外存活 Go 堆回落到 goja 约 0.03–0.05 MiB、moejs 约 0.18–0.97 MiB。这包含一次性进程缓存;本实验没有据此认定泄漏。RSS 不一定同步回落,不能只看关闭后的 RSS 判断对象是否已释放。
|
||||||
|
|
||||||
|
## 热路径 CPU
|
||||||
|
|
||||||
|
| 扩展 | goja CPU (ms/次) | moejs CPU (ms/次) | CPU 减少 |
|
||||||
|
| --- | ---: | ---: | ---: |
|
||||||
|
| bilibili | 19.688 | 3.173 | 83.9% |
|
||||||
|
| youtube | 2.905 | 0.215 | 92.6% |
|
||||||
|
| twitter | 3.265 | 0.453 | 86.1% |
|
||||||
|
|
||||||
|
|
||||||
|
热路径的大幅 CPU 节省再次成立。但它要求持有并复用已加载的环境;对当前每个事件重建环境的实现,应该采用上面的 cold 结果评估迁移。
|
||||||
|
|
||||||
|
## 决策
|
||||||
|
|
||||||
|
按当前扩展和架构,CPU/内存补测没有提供足够的替换依据。尤其 B 站和 YouTube 的 CPU 节省有限,内存没有一致改善,加上主报告里压缩体积几乎不变,应先维持 goja,把本 PR 留作调研记录。
|
||||||
|
|
||||||
|
未来若出现长时间执行计算、反复复用环境的真实扩展,再重新评估;若独立研究编译缓存或环境复用,必须同时在 goja 和 moejs 上比较收益,不能把架构优化全部归给引擎替换。
|
||||||
|
|
||||||
|
## 复现和证据
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cd experiments/moejs
|
||||||
|
python3 fetch_sources.py
|
||||||
|
python3 measure_resources.py > results/resources-run.txt
|
||||||
|
# 只重新汇总已保存的原始样本,不启动新测量
|
||||||
|
python3 measure_resources.py --summarize-only
|
||||||
|
# 必要时只重测驻留组,保留之前的 CPU 样本
|
||||||
|
python3 measure_resources.py --memory-only > results/resources-memory-run.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
原始样本:[resources.json](results/resources.json);汇总:[resources-summary.json](results/resources-summary.json)。首次资源运行日志:[resources-run.txt](results/resources-run.txt);稳定 GC 后重测驻留组日志:[resources-memory-run.txt](results/resources-memory-run.txt)。首次日志中的驻留组已被后者替代。当前 worker:[resource_worker_test.go](resource_worker_test.go);驱动:[measure_resources.py](measure_resources.py);功能检查:[resources-tests.txt](results/resources-tests.txt)。CPU/warm 组中单次 GC 的快照保留作原始记录,内存结论只使用重新测得的 `retained` 组。
|
||||||
@@ -0,0 +1,88 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Measure equal extension work in fresh OS processes, never CPU percentage."""
|
||||||
|
import argparse
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
from pathlib import Path
|
||||||
|
import statistics
|
||||||
|
import subprocess
|
||||||
|
import tempfile
|
||||||
|
|
||||||
|
root = Path(__file__).resolve().parent
|
||||||
|
os.chdir(root)
|
||||||
|
parser = argparse.ArgumentParser()
|
||||||
|
parser.add_argument('--repeats', type=int, default=5)
|
||||||
|
options = parser.add_mutually_exclusive_group()
|
||||||
|
options.add_argument('--smoke', action='store_true')
|
||||||
|
options.add_argument('--memory-only', action='store_true', help='replace retained samples, keeping saved CPU samples')
|
||||||
|
options.add_argument('--summarize-only', action='store_true')
|
||||||
|
args = parser.parse_args()
|
||||||
|
if args.repeats < 1:
|
||||||
|
parser.error('--repeats must be positive')
|
||||||
|
all_workloads = [('cold',20),('warm',200),('retained',1),('retained',8)]
|
||||||
|
workloads = [('cold',2),('warm',2),('retained',2)] if args.smoke else all_workloads
|
||||||
|
filename = 'resources-smoke.json' if args.smoke else 'resources.json'
|
||||||
|
rows = []
|
||||||
|
if args.summarize_only:
|
||||||
|
rows = json.loads((root/'results'/filename).read_text())
|
||||||
|
else:
|
||||||
|
(root/'bin').mkdir(exist_ok=True)
|
||||||
|
binary = root/'bin/resource-worker.test'
|
||||||
|
subprocess.run(['go','test','-pgo=off','-c','-o',str(binary)],check=True)
|
||||||
|
if args.memory_only:
|
||||||
|
rows = [r for r in json.loads((root/'results'/filename).read_text()) if r['mode'] != 'retained']
|
||||||
|
workloads = [('retained',1),('retained',8)]
|
||||||
|
with tempfile.TemporaryDirectory(prefix='gopeed-resource-') as temp:
|
||||||
|
for extension in ['bilibili','youtube','twitter']:
|
||||||
|
for mode,count in workloads:
|
||||||
|
for repeat in range(args.repeats):
|
||||||
|
engines = ['goja','moejs'] if repeat % 2 == 0 else ['moejs','goja']
|
||||||
|
for engine in engines:
|
||||||
|
output = Path(temp)/'result.json'
|
||||||
|
env = {**os.environ,'GOMAXPROCS':'1','GOGC':'100','GOMEMLIMIT':'off',
|
||||||
|
'GOPEED_RESOURCE_WORKER':'1','RESOURCE_ENGINE':engine,
|
||||||
|
'RESOURCE_EXTENSION':extension,'RESOURCE_MODE':mode,
|
||||||
|
'RESOURCE_COUNT':str(count),'RESOURCE_OUTPUT':str(output)}
|
||||||
|
run = subprocess.run([str(binary),'-test.run=^TestResourceWorker$','-test.timeout=90s'],
|
||||||
|
env=env,text=True,capture_output=True,timeout=100)
|
||||||
|
if run.returncode:
|
||||||
|
raise RuntimeError(run.stdout+run.stderr)
|
||||||
|
row = json.loads(output.read_text())
|
||||||
|
row['repeat'] = repeat
|
||||||
|
rows.append(row)
|
||||||
|
hashes = {r['output_sha256'] for r in rows if r['extension']==extension}
|
||||||
|
if len(hashes)!=1:
|
||||||
|
raise RuntimeError(f'Output mismatch for {extension}: {hashes}')
|
||||||
|
cpu = (row['user_cpu_ns']+row['system_cpu_ns'])/count/1e6
|
||||||
|
print(f'{extension}/{mode}/{count}/{engine} repeat={repeat+1}: '
|
||||||
|
f'CPU={cpu:.3f} ms/op, peakRSS={row["after_work"]["process_peak_rss_bytes"]/2**20:.1f} MiB',flush=True)
|
||||||
|
(root/'results'/filename).write_text(json.dumps(rows,indent=2)+'\n')
|
||||||
|
|
||||||
|
summary = []
|
||||||
|
for extension in ['bilibili','youtube','twitter']:
|
||||||
|
for mode,count in (all_workloads if args.memory_only else workloads):
|
||||||
|
for engine in ['goja','moejs']:
|
||||||
|
group = [r for r in rows if (r['extension'],r['mode'],r['count'],r['engine']) == (extension,mode,count,engine)]
|
||||||
|
if not group:
|
||||||
|
raise RuntimeError(f'Missing samples for {extension}/{mode}/{count}/{engine}')
|
||||||
|
def med(fn): return statistics.median(fn(r) for r in group)
|
||||||
|
cpu = [(r['user_cpu_ns']+r['system_cpu_ns'])/count for r in group]
|
||||||
|
summary.append(dict(extension=extension,mode=mode,count=count,engine=engine,samples=len(group),
|
||||||
|
cpu_ns_per_op=statistics.median(cpu),cpu_ns_min=min(cpu),cpu_ns_max=max(cpu),
|
||||||
|
user_cpu_ns_per_op=med(lambda r:r['user_cpu_ns']/count),
|
||||||
|
system_cpu_ns_per_op=med(lambda r:r['system_cpu_ns']/count),
|
||||||
|
wall_ns_per_op=med(lambda r:r['wall_ns']/count),
|
||||||
|
allocated_bytes_per_op=med(lambda r:r['allocated_bytes']/count),
|
||||||
|
gc_cycles=med(lambda r:r['gc_cycles']),
|
||||||
|
peak_rss_bytes=med(lambda r:r['after_work']['process_peak_rss_bytes']),
|
||||||
|
peak_rss_min_bytes=min(r['after_work']['process_peak_rss_bytes'] for r in group),
|
||||||
|
peak_rss_max_bytes=max(r['after_work']['process_peak_rss_bytes'] for r in group),
|
||||||
|
rss_after_work_bytes=med(lambda r:r['after_work']['rss_bytes']),
|
||||||
|
live_heap_bytes=med(lambda r:r['after_gc']['heap_alloc_bytes']),
|
||||||
|
live_heap_delta_bytes=med(lambda r:r['after_gc']['heap_alloc_bytes']-r['baseline']['heap_alloc_bytes']),
|
||||||
|
retained_rss_bytes=med(lambda r:r['after_os_release']['rss_bytes']),
|
||||||
|
retained_rss_delta_bytes=med(lambda r:r['after_os_release']['rss_bytes']-r['baseline']['rss_bytes']),
|
||||||
|
after_close_heap_delta_bytes=med(lambda r:r['after_close_os_release']['heap_alloc_bytes']-r['baseline']['heap_alloc_bytes']),
|
||||||
|
after_close_rss_bytes=med(lambda r:r['after_close_os_release']['rss_bytes'])))
|
||||||
|
name = 'resources-smoke-summary.json' if args.smoke else 'resources-summary.json'
|
||||||
|
(root/'results'/name).write_text(json.dumps(summary,indent=2)+'\n')
|
||||||
@@ -0,0 +1,232 @@
|
|||||||
|
//go:build darwin || linux
|
||||||
|
|
||||||
|
package evaluation
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto/sha256"
|
||||||
|
"encoding/hex"
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
"runtime"
|
||||||
|
"runtime/debug"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
"syscall"
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type resourceSnapshot struct {
|
||||||
|
HeapAlloc uint64 `json:"heap_alloc_bytes"`
|
||||||
|
HeapInuse uint64 `json:"heap_inuse_bytes"`
|
||||||
|
HeapObjects uint64 `json:"heap_objects"`
|
||||||
|
RSS int64 `json:"rss_bytes"`
|
||||||
|
PeakRSS int64 `json:"process_peak_rss_bytes"`
|
||||||
|
Goroutines int `json:"goroutines"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type resourceResult struct {
|
||||||
|
Engine string `json:"engine"`
|
||||||
|
Extension string `json:"extension"`
|
||||||
|
Mode string `json:"mode"`
|
||||||
|
Count int `json:"count"`
|
||||||
|
UserNS int64 `json:"user_cpu_ns"`
|
||||||
|
SystemNS int64 `json:"system_cpu_ns"`
|
||||||
|
WallNS int64 `json:"wall_ns"`
|
||||||
|
Allocated uint64 `json:"allocated_bytes"`
|
||||||
|
GCs uint32 `json:"gc_cycles"`
|
||||||
|
GCPause uint64 `json:"gc_pause_ns"`
|
||||||
|
OutputHash string `json:"output_sha256"`
|
||||||
|
Baseline resourceSnapshot `json:"baseline"`
|
||||||
|
AfterWork resourceSnapshot `json:"after_work"`
|
||||||
|
AfterGC resourceSnapshot `json:"after_gc"`
|
||||||
|
AfterOSRelease resourceSnapshot `json:"after_os_release"`
|
||||||
|
AfterClose resourceSnapshot `json:"after_close_os_release"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// moejs releases weak-keyed compiled metadata via asynchronous Go cleanups.
|
||||||
|
// Multiple collections with scheduling opportunities avoid counting objects
|
||||||
|
// pending those cleanups as permanently live. This is outside CPU timing.
|
||||||
|
func settledGC(t *testing.T) {
|
||||||
|
t.Helper()
|
||||||
|
var previous uint64
|
||||||
|
for i := 0; i < 8; i++ {
|
||||||
|
runtime.GC()
|
||||||
|
time.Sleep(20 * time.Millisecond)
|
||||||
|
var m runtime.MemStats
|
||||||
|
runtime.ReadMemStats(&m)
|
||||||
|
delta := m.HeapAlloc
|
||||||
|
if previous > m.HeapAlloc {
|
||||||
|
delta = previous - m.HeapAlloc
|
||||||
|
} else {
|
||||||
|
delta = m.HeapAlloc - previous
|
||||||
|
}
|
||||||
|
if i >= 2 && delta < 64*1024 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
previous = m.HeapAlloc
|
||||||
|
}
|
||||||
|
t.Fatal("live heap did not settle within eight GC rounds")
|
||||||
|
}
|
||||||
|
|
||||||
|
func selfUsage(t *testing.T) syscall.Rusage {
|
||||||
|
t.Helper()
|
||||||
|
var usage syscall.Rusage
|
||||||
|
if err := syscall.Getrusage(syscall.RUSAGE_SELF, &usage); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
return usage
|
||||||
|
}
|
||||||
|
|
||||||
|
func timevalNS(v syscall.Timeval) int64 { return int64(v.Sec)*1e9 + int64(v.Usec)*1e3 }
|
||||||
|
|
||||||
|
func snapshot(t *testing.T) resourceSnapshot {
|
||||||
|
t.Helper()
|
||||||
|
var mem runtime.MemStats
|
||||||
|
runtime.ReadMemStats(&mem)
|
||||||
|
// ps runs only outside the timed CPU interval. RUSAGE_SELF excludes its CPU.
|
||||||
|
b, err := exec.Command("ps", "-o", "rss=", "-p", strconv.Itoa(os.Getpid())).Output()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
rss, err := strconv.ParseInt(strings.TrimSpace(string(b)), 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
peak := int64(selfUsage(t).Maxrss)
|
||||||
|
if runtime.GOOS == "linux" {
|
||||||
|
peak *= 1024
|
||||||
|
}
|
||||||
|
return resourceSnapshot{mem.HeapAlloc, mem.HeapInuse, mem.HeapObjects, rss * 1024, peak, runtime.NumGoroutine()}
|
||||||
|
}
|
||||||
|
|
||||||
|
func resourceRuntime(t *testing.T, engine, name, src, host string) Runtime {
|
||||||
|
t.Helper()
|
||||||
|
r, err := New(engine)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
// Clone the bundle for each runtime, like a fresh production file read.
|
||||||
|
for _, s := range []string{fmt.Sprintf("var extensionName=%q;", name), host, strings.Clone(src)} {
|
||||||
|
if _, err = r.Eval(s); err != nil {
|
||||||
|
r.Close()
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return r
|
||||||
|
}
|
||||||
|
|
||||||
|
func resolveResource(t *testing.T, r Runtime) string {
|
||||||
|
t.Helper()
|
||||||
|
value, err := r.Eval("resolveOnce()")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
text, ok := value.(string)
|
||||||
|
if !ok {
|
||||||
|
t.Fatalf("unexpected resolve result %T", value)
|
||||||
|
}
|
||||||
|
sum := sha256.Sum256([]byte(text))
|
||||||
|
return hex.EncodeToString(sum[:])
|
||||||
|
}
|
||||||
|
|
||||||
|
// Each invocation is a fresh OS process. The Python driver repeats both engines
|
||||||
|
// in alternating order; the ordinary test suite skips this measurement worker.
|
||||||
|
func TestResourceWorker(t *testing.T) {
|
||||||
|
if os.Getenv("GOPEED_RESOURCE_WORKER") != "1" {
|
||||||
|
t.Skip("process resource measurement worker")
|
||||||
|
}
|
||||||
|
engine, name, mode := os.Getenv("RESOURCE_ENGINE"), os.Getenv("RESOURCE_EXTENSION"), os.Getenv("RESOURCE_MODE")
|
||||||
|
count, err := strconv.Atoi(os.Getenv("RESOURCE_COUNT"))
|
||||||
|
if err != nil || count < 1 || count > 10000 {
|
||||||
|
t.Fatal("invalid RESOURCE_COUNT")
|
||||||
|
}
|
||||||
|
src := source(t, name)
|
||||||
|
hostBytes, err := os.ReadFile("replay.js")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
host := string(hostBytes)
|
||||||
|
// Pay one-time global initialization only before timing repeat events.
|
||||||
|
// Retained-memory runs start without a priming runtime so their memory
|
||||||
|
// includes the selected engine's first-use caches and builtins.
|
||||||
|
var hash string
|
||||||
|
if mode != "retained" {
|
||||||
|
prime := resourceRuntime(t, engine, name, src, host)
|
||||||
|
hash = resolveResource(t, prime)
|
||||||
|
prime.Close()
|
||||||
|
prime = nil
|
||||||
|
}
|
||||||
|
debug.FreeOSMemory()
|
||||||
|
result := resourceResult{Engine: engine, Extension: name, Mode: mode, Count: count, Baseline: snapshot(t)}
|
||||||
|
var retained []Runtime
|
||||||
|
if mode == "warm" {
|
||||||
|
r := resourceRuntime(t, engine, name, src, host)
|
||||||
|
if h := resolveResource(t, r); h != hash {
|
||||||
|
t.Fatal("warm output differs")
|
||||||
|
}
|
||||||
|
retained = append(retained, r)
|
||||||
|
debug.FreeOSMemory()
|
||||||
|
}
|
||||||
|
var before, after runtime.MemStats
|
||||||
|
runtime.ReadMemStats(&before)
|
||||||
|
cpuBefore := selfUsage(t)
|
||||||
|
started := time.Now()
|
||||||
|
for i := 0; i < count; i++ {
|
||||||
|
var r Runtime
|
||||||
|
switch mode {
|
||||||
|
case "warm":
|
||||||
|
r = retained[0]
|
||||||
|
case "cold", "retained":
|
||||||
|
r = resourceRuntime(t, engine, name, src, host)
|
||||||
|
default:
|
||||||
|
t.Fatal("unknown RESOURCE_MODE")
|
||||||
|
}
|
||||||
|
h := resolveResource(t, r)
|
||||||
|
if hash == "" {
|
||||||
|
hash = h
|
||||||
|
} else if h != hash {
|
||||||
|
t.Fatal("resolve output changed")
|
||||||
|
}
|
||||||
|
if mode == "retained" {
|
||||||
|
retained = append(retained, r)
|
||||||
|
} else if mode == "cold" {
|
||||||
|
r.Close()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result.WallNS = time.Since(started).Nanoseconds()
|
||||||
|
cpuAfter := selfUsage(t)
|
||||||
|
runtime.ReadMemStats(&after)
|
||||||
|
result.UserNS = timevalNS(cpuAfter.Utime) - timevalNS(cpuBefore.Utime)
|
||||||
|
result.SystemNS = timevalNS(cpuAfter.Stime) - timevalNS(cpuBefore.Stime)
|
||||||
|
result.Allocated = after.TotalAlloc - before.TotalAlloc
|
||||||
|
result.GCs = after.NumGC - before.NumGC
|
||||||
|
result.GCPause = after.PauseTotalNs - before.PauseTotalNs
|
||||||
|
result.AfterWork = snapshot(t)
|
||||||
|
settledGC(t)
|
||||||
|
result.AfterGC = snapshot(t)
|
||||||
|
debug.FreeOSMemory()
|
||||||
|
result.AfterOSRelease = snapshot(t)
|
||||||
|
runtime.KeepAlive(retained)
|
||||||
|
for _, r := range retained {
|
||||||
|
r.Close()
|
||||||
|
}
|
||||||
|
retained = nil
|
||||||
|
settledGC(t)
|
||||||
|
debug.FreeOSMemory()
|
||||||
|
result.AfterClose = snapshot(t)
|
||||||
|
// Keep input strings alive across all snapshots, including after closing
|
||||||
|
// runtimes, so memory deltas cannot accidentally subtract the input bundle.
|
||||||
|
runtime.KeepAlive(src)
|
||||||
|
runtime.KeepAlive(host)
|
||||||
|
result.OutputHash = hash
|
||||||
|
output, err := json.MarshalIndent(result, "", " ")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
if err = os.WriteFile(os.Getenv("RESOURCE_OUTPUT"), append(output, '\n'), 0644); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
bilibili/retained/1/goja repeat=1: CPU=128.924 ms/op, peakRSS=113.7 MiB
|
||||||
|
bilibili/retained/1/moejs repeat=1: CPU=108.563 ms/op, peakRSS=109.7 MiB
|
||||||
|
bilibili/retained/1/moejs repeat=2: CPU=103.893 ms/op, peakRSS=110.5 MiB
|
||||||
|
bilibili/retained/1/goja repeat=2: CPU=119.400 ms/op, peakRSS=113.9 MiB
|
||||||
|
bilibili/retained/1/goja repeat=3: CPU=125.350 ms/op, peakRSS=117.8 MiB
|
||||||
|
bilibili/retained/1/moejs repeat=3: CPU=110.583 ms/op, peakRSS=110.8 MiB
|
||||||
|
bilibili/retained/1/moejs repeat=4: CPU=104.953 ms/op, peakRSS=110.7 MiB
|
||||||
|
bilibili/retained/1/goja repeat=4: CPU=129.226 ms/op, peakRSS=112.7 MiB
|
||||||
|
bilibili/retained/1/goja repeat=5: CPU=117.278 ms/op, peakRSS=113.5 MiB
|
||||||
|
bilibili/retained/1/moejs repeat=5: CPU=105.932 ms/op, peakRSS=110.6 MiB
|
||||||
|
bilibili/retained/8/goja repeat=1: CPU=135.193 ms/op, peakRSS=339.0 MiB
|
||||||
|
bilibili/retained/8/moejs repeat=1: CPU=106.505 ms/op, peakRSS=291.5 MiB
|
||||||
|
bilibili/retained/8/moejs repeat=2: CPU=108.446 ms/op, peakRSS=322.6 MiB
|
||||||
|
bilibili/retained/8/goja repeat=2: CPU=138.953 ms/op, peakRSS=361.2 MiB
|
||||||
|
bilibili/retained/8/goja repeat=3: CPU=137.391 ms/op, peakRSS=362.8 MiB
|
||||||
|
bilibili/retained/8/moejs repeat=3: CPU=106.384 ms/op, peakRSS=276.2 MiB
|
||||||
|
bilibili/retained/8/moejs repeat=4: CPU=106.178 ms/op, peakRSS=302.2 MiB
|
||||||
|
bilibili/retained/8/goja repeat=4: CPU=135.749 ms/op, peakRSS=363.1 MiB
|
||||||
|
bilibili/retained/8/goja repeat=5: CPU=136.385 ms/op, peakRSS=357.0 MiB
|
||||||
|
bilibili/retained/8/moejs repeat=5: CPU=106.298 ms/op, peakRSS=309.8 MiB
|
||||||
|
youtube/retained/1/goja repeat=1: CPU=263.248 ms/op, peakRSS=202.4 MiB
|
||||||
|
youtube/retained/1/moejs repeat=1: CPU=249.762 ms/op, peakRSS=189.8 MiB
|
||||||
|
youtube/retained/1/moejs repeat=2: CPU=239.557 ms/op, peakRSS=194.6 MiB
|
||||||
|
youtube/retained/1/goja repeat=2: CPU=258.828 ms/op, peakRSS=204.4 MiB
|
||||||
|
youtube/retained/1/goja repeat=3: CPU=262.150 ms/op, peakRSS=203.1 MiB
|
||||||
|
youtube/retained/1/moejs repeat=3: CPU=242.040 ms/op, peakRSS=191.3 MiB
|
||||||
|
youtube/retained/1/moejs repeat=4: CPU=237.677 ms/op, peakRSS=194.4 MiB
|
||||||
|
youtube/retained/1/goja repeat=4: CPU=260.255 ms/op, peakRSS=201.9 MiB
|
||||||
|
youtube/retained/1/goja repeat=5: CPU=275.425 ms/op, peakRSS=205.3 MiB
|
||||||
|
youtube/retained/1/moejs repeat=5: CPU=254.674 ms/op, peakRSS=190.8 MiB
|
||||||
|
youtube/retained/8/goja repeat=1: CPU=293.475 ms/op, peakRSS=663.5 MiB
|
||||||
|
youtube/retained/8/moejs repeat=1: CPU=233.453 ms/op, peakRSS=699.2 MiB
|
||||||
|
youtube/retained/8/moejs repeat=2: CPU=232.512 ms/op, peakRSS=679.2 MiB
|
||||||
|
youtube/retained/8/goja repeat=2: CPU=295.749 ms/op, peakRSS=668.1 MiB
|
||||||
|
youtube/retained/8/goja repeat=3: CPU=293.476 ms/op, peakRSS=607.0 MiB
|
||||||
|
youtube/retained/8/moejs repeat=3: CPU=231.929 ms/op, peakRSS=623.0 MiB
|
||||||
|
youtube/retained/8/moejs repeat=4: CPU=233.816 ms/op, peakRSS=698.8 MiB
|
||||||
|
youtube/retained/8/goja repeat=4: CPU=284.988 ms/op, peakRSS=616.5 MiB
|
||||||
|
youtube/retained/8/goja repeat=5: CPU=299.837 ms/op, peakRSS=633.7 MiB
|
||||||
|
youtube/retained/8/moejs repeat=5: CPU=232.017 ms/op, peakRSS=623.5 MiB
|
||||||
|
twitter/retained/1/goja repeat=1: CPU=14.898 ms/op, peakRSS=75.3 MiB
|
||||||
|
twitter/retained/1/moejs repeat=1: CPU=11.448 ms/op, peakRSS=74.1 MiB
|
||||||
|
twitter/retained/1/moejs repeat=2: CPU=11.200 ms/op, peakRSS=75.0 MiB
|
||||||
|
twitter/retained/1/goja repeat=2: CPU=15.070 ms/op, peakRSS=95.0 MiB
|
||||||
|
twitter/retained/1/goja repeat=3: CPU=15.161 ms/op, peakRSS=75.4 MiB
|
||||||
|
twitter/retained/1/moejs repeat=3: CPU=11.442 ms/op, peakRSS=74.5 MiB
|
||||||
|
twitter/retained/1/moejs repeat=4: CPU=11.417 ms/op, peakRSS=74.4 MiB
|
||||||
|
twitter/retained/1/goja repeat=4: CPU=15.046 ms/op, peakRSS=75.3 MiB
|
||||||
|
twitter/retained/1/goja repeat=5: CPU=15.185 ms/op, peakRSS=75.2 MiB
|
||||||
|
twitter/retained/1/moejs repeat=5: CPU=12.036 ms/op, peakRSS=74.2 MiB
|
||||||
|
twitter/retained/8/goja repeat=1: CPU=19.321 ms/op, peakRSS=106.7 MiB
|
||||||
|
twitter/retained/8/moejs repeat=1: CPU=12.334 ms/op, peakRSS=93.3 MiB
|
||||||
|
twitter/retained/8/moejs repeat=2: CPU=12.144 ms/op, peakRSS=93.3 MiB
|
||||||
|
twitter/retained/8/goja repeat=2: CPU=19.295 ms/op, peakRSS=109.0 MiB
|
||||||
|
twitter/retained/8/goja repeat=3: CPU=18.405 ms/op, peakRSS=98.2 MiB
|
||||||
|
twitter/retained/8/moejs repeat=3: CPU=11.997 ms/op, peakRSS=93.2 MiB
|
||||||
|
twitter/retained/8/moejs repeat=4: CPU=12.301 ms/op, peakRSS=93.2 MiB
|
||||||
|
twitter/retained/8/goja repeat=4: CPU=19.434 ms/op, peakRSS=106.7 MiB
|
||||||
|
twitter/retained/8/goja repeat=5: CPU=18.415 ms/op, peakRSS=98.4 MiB
|
||||||
|
twitter/retained/8/moejs repeat=5: CPU=12.492 ms/op, peakRSS=92.9 MiB
|
||||||
@@ -0,0 +1,120 @@
|
|||||||
|
bilibili/cold/20/goja repeat=1: CPU=119.376 ms/op, peakRSS=154.7 MiB
|
||||||
|
bilibili/cold/20/moejs repeat=1: CPU=105.032 ms/op, peakRSS=171.3 MiB
|
||||||
|
bilibili/cold/20/moejs repeat=2: CPU=103.703 ms/op, peakRSS=178.6 MiB
|
||||||
|
bilibili/cold/20/goja repeat=2: CPU=118.962 ms/op, peakRSS=151.4 MiB
|
||||||
|
bilibili/cold/20/goja repeat=3: CPU=118.279 ms/op, peakRSS=143.4 MiB
|
||||||
|
bilibili/cold/20/moejs repeat=3: CPU=103.668 ms/op, peakRSS=172.3 MiB
|
||||||
|
bilibili/cold/20/moejs repeat=4: CPU=104.081 ms/op, peakRSS=174.6 MiB
|
||||||
|
bilibili/cold/20/goja repeat=4: CPU=116.987 ms/op, peakRSS=155.2 MiB
|
||||||
|
bilibili/cold/20/goja repeat=5: CPU=119.285 ms/op, peakRSS=158.0 MiB
|
||||||
|
bilibili/cold/20/moejs repeat=5: CPU=104.162 ms/op, peakRSS=167.5 MiB
|
||||||
|
bilibili/warm/200/goja repeat=1: CPU=19.869 ms/op, peakRSS=127.2 MiB
|
||||||
|
bilibili/warm/200/moejs repeat=1: CPU=3.173 ms/op, peakRSS=118.5 MiB
|
||||||
|
bilibili/warm/200/moejs repeat=2: CPU=3.166 ms/op, peakRSS=118.2 MiB
|
||||||
|
bilibili/warm/200/goja repeat=2: CPU=19.644 ms/op, peakRSS=124.0 MiB
|
||||||
|
bilibili/warm/200/goja repeat=3: CPU=19.543 ms/op, peakRSS=127.3 MiB
|
||||||
|
bilibili/warm/200/moejs repeat=3: CPU=3.171 ms/op, peakRSS=118.5 MiB
|
||||||
|
bilibili/warm/200/moejs repeat=4: CPU=3.202 ms/op, peakRSS=119.3 MiB
|
||||||
|
bilibili/warm/200/goja repeat=4: CPU=19.688 ms/op, peakRSS=124.5 MiB
|
||||||
|
bilibili/warm/200/goja repeat=5: CPU=19.852 ms/op, peakRSS=125.2 MiB
|
||||||
|
bilibili/warm/200/moejs repeat=5: CPU=3.208 ms/op, peakRSS=118.6 MiB
|
||||||
|
bilibili/retained/1/goja repeat=1: CPU=132.688 ms/op, peakRSS=121.9 MiB
|
||||||
|
bilibili/retained/1/moejs repeat=1: CPU=108.554 ms/op, peakRSS=109.5 MiB
|
||||||
|
bilibili/retained/1/moejs repeat=2: CPU=111.625 ms/op, peakRSS=110.8 MiB
|
||||||
|
bilibili/retained/1/goja repeat=2: CPU=134.311 ms/op, peakRSS=121.9 MiB
|
||||||
|
bilibili/retained/1/goja repeat=3: CPU=128.855 ms/op, peakRSS=114.1 MiB
|
||||||
|
bilibili/retained/1/moejs repeat=3: CPU=109.405 ms/op, peakRSS=109.4 MiB
|
||||||
|
bilibili/retained/1/moejs repeat=4: CPU=107.809 ms/op, peakRSS=110.5 MiB
|
||||||
|
bilibili/retained/1/goja repeat=4: CPU=118.308 ms/op, peakRSS=108.8 MiB
|
||||||
|
bilibili/retained/1/goja repeat=5: CPU=116.917 ms/op, peakRSS=108.7 MiB
|
||||||
|
bilibili/retained/1/moejs repeat=5: CPU=108.363 ms/op, peakRSS=108.9 MiB
|
||||||
|
bilibili/retained/8/goja repeat=1: CPU=140.169 ms/op, peakRSS=362.2 MiB
|
||||||
|
bilibili/retained/8/moejs repeat=1: CPU=107.816 ms/op, peakRSS=306.9 MiB
|
||||||
|
bilibili/retained/8/moejs repeat=2: CPU=105.929 ms/op, peakRSS=298.2 MiB
|
||||||
|
bilibili/retained/8/goja repeat=2: CPU=134.081 ms/op, peakRSS=329.5 MiB
|
||||||
|
bilibili/retained/8/goja repeat=3: CPU=133.975 ms/op, peakRSS=355.8 MiB
|
||||||
|
bilibili/retained/8/moejs repeat=3: CPU=107.769 ms/op, peakRSS=316.6 MiB
|
||||||
|
bilibili/retained/8/moejs repeat=4: CPU=105.431 ms/op, peakRSS=271.5 MiB
|
||||||
|
bilibili/retained/8/goja repeat=4: CPU=134.465 ms/op, peakRSS=346.5 MiB
|
||||||
|
bilibili/retained/8/goja repeat=5: CPU=142.183 ms/op, peakRSS=361.4 MiB
|
||||||
|
bilibili/retained/8/moejs repeat=5: CPU=107.668 ms/op, peakRSS=292.8 MiB
|
||||||
|
youtube/cold/20/goja repeat=1: CPU=280.323 ms/op, peakRSS=293.2 MiB
|
||||||
|
youtube/cold/20/moejs repeat=1: CPU=235.688 ms/op, peakRSS=339.6 MiB
|
||||||
|
youtube/cold/20/moejs repeat=2: CPU=239.981 ms/op, peakRSS=374.8 MiB
|
||||||
|
youtube/cold/20/goja repeat=2: CPU=278.476 ms/op, peakRSS=283.8 MiB
|
||||||
|
youtube/cold/20/goja repeat=3: CPU=269.321 ms/op, peakRSS=247.4 MiB
|
||||||
|
youtube/cold/20/moejs repeat=3: CPU=237.330 ms/op, peakRSS=353.6 MiB
|
||||||
|
youtube/cold/20/moejs repeat=4: CPU=239.973 ms/op, peakRSS=376.2 MiB
|
||||||
|
youtube/cold/20/goja repeat=4: CPU=279.683 ms/op, peakRSS=269.2 MiB
|
||||||
|
youtube/cold/20/goja repeat=5: CPU=275.033 ms/op, peakRSS=288.9 MiB
|
||||||
|
youtube/cold/20/moejs repeat=5: CPU=237.308 ms/op, peakRSS=358.9 MiB
|
||||||
|
youtube/warm/200/goja repeat=1: CPU=2.895 ms/op, peakRSS=205.4 MiB
|
||||||
|
youtube/warm/200/moejs repeat=1: CPU=0.215 ms/op, peakRSS=198.4 MiB
|
||||||
|
youtube/warm/200/moejs repeat=2: CPU=0.215 ms/op, peakRSS=193.8 MiB
|
||||||
|
youtube/warm/200/goja repeat=2: CPU=2.905 ms/op, peakRSS=203.9 MiB
|
||||||
|
youtube/warm/200/goja repeat=3: CPU=2.993 ms/op, peakRSS=204.5 MiB
|
||||||
|
youtube/warm/200/moejs repeat=3: CPU=0.216 ms/op, peakRSS=201.8 MiB
|
||||||
|
youtube/warm/200/moejs repeat=4: CPU=0.216 ms/op, peakRSS=199.2 MiB
|
||||||
|
youtube/warm/200/goja repeat=4: CPU=2.912 ms/op, peakRSS=204.5 MiB
|
||||||
|
youtube/warm/200/goja repeat=5: CPU=2.900 ms/op, peakRSS=205.4 MiB
|
||||||
|
youtube/warm/200/moejs repeat=5: CPU=0.214 ms/op, peakRSS=201.7 MiB
|
||||||
|
youtube/retained/1/goja repeat=1: CPU=266.054 ms/op, peakRSS=202.5 MiB
|
||||||
|
youtube/retained/1/moejs repeat=1: CPU=246.957 ms/op, peakRSS=187.4 MiB
|
||||||
|
youtube/retained/1/moejs repeat=2: CPU=238.809 ms/op, peakRSS=195.7 MiB
|
||||||
|
youtube/retained/1/goja repeat=2: CPU=264.583 ms/op, peakRSS=203.7 MiB
|
||||||
|
youtube/retained/1/goja repeat=3: CPU=276.460 ms/op, peakRSS=205.2 MiB
|
||||||
|
youtube/retained/1/moejs repeat=3: CPU=244.340 ms/op, peakRSS=193.2 MiB
|
||||||
|
youtube/retained/1/moejs repeat=4: CPU=242.499 ms/op, peakRSS=193.5 MiB
|
||||||
|
youtube/retained/1/goja repeat=4: CPU=266.238 ms/op, peakRSS=204.8 MiB
|
||||||
|
youtube/retained/1/goja repeat=5: CPU=271.543 ms/op, peakRSS=204.9 MiB
|
||||||
|
youtube/retained/1/moejs repeat=5: CPU=246.237 ms/op, peakRSS=189.5 MiB
|
||||||
|
youtube/retained/8/goja repeat=1: CPU=301.610 ms/op, peakRSS=617.3 MiB
|
||||||
|
youtube/retained/8/moejs repeat=1: CPU=235.625 ms/op, peakRSS=674.7 MiB
|
||||||
|
youtube/retained/8/moejs repeat=2: CPU=239.678 ms/op, peakRSS=670.2 MiB
|
||||||
|
youtube/retained/8/goja repeat=2: CPU=292.897 ms/op, peakRSS=615.8 MiB
|
||||||
|
youtube/retained/8/goja repeat=3: CPU=294.733 ms/op, peakRSS=674.6 MiB
|
||||||
|
youtube/retained/8/moejs repeat=3: CPU=233.436 ms/op, peakRSS=618.6 MiB
|
||||||
|
youtube/retained/8/moejs repeat=4: CPU=236.478 ms/op, peakRSS=679.0 MiB
|
||||||
|
youtube/retained/8/goja repeat=4: CPU=297.068 ms/op, peakRSS=668.8 MiB
|
||||||
|
youtube/retained/8/goja repeat=5: CPU=297.040 ms/op, peakRSS=676.7 MiB
|
||||||
|
youtube/retained/8/moejs repeat=5: CPU=241.736 ms/op, peakRSS=706.0 MiB
|
||||||
|
twitter/cold/20/goja repeat=1: CPU=15.356 ms/op, peakRSS=79.7 MiB
|
||||||
|
twitter/cold/20/moejs repeat=1: CPU=10.555 ms/op, peakRSS=97.0 MiB
|
||||||
|
twitter/cold/20/moejs repeat=2: CPU=10.767 ms/op, peakRSS=82.5 MiB
|
||||||
|
twitter/cold/20/goja repeat=2: CPU=15.595 ms/op, peakRSS=78.9 MiB
|
||||||
|
twitter/cold/20/goja repeat=3: CPU=15.555 ms/op, peakRSS=79.9 MiB
|
||||||
|
twitter/cold/20/moejs repeat=3: CPU=10.720 ms/op, peakRSS=97.0 MiB
|
||||||
|
twitter/cold/20/moejs repeat=4: CPU=10.594 ms/op, peakRSS=82.3 MiB
|
||||||
|
twitter/cold/20/goja repeat=4: CPU=15.477 ms/op, peakRSS=80.2 MiB
|
||||||
|
twitter/cold/20/goja repeat=5: CPU=15.898 ms/op, peakRSS=79.0 MiB
|
||||||
|
twitter/cold/20/moejs repeat=5: CPU=10.541 ms/op, peakRSS=96.8 MiB
|
||||||
|
twitter/warm/200/goja repeat=1: CPU=3.278 ms/op, peakRSS=78.7 MiB
|
||||||
|
twitter/warm/200/moejs repeat=1: CPU=0.455 ms/op, peakRSS=76.4 MiB
|
||||||
|
twitter/warm/200/moejs repeat=2: CPU=0.452 ms/op, peakRSS=96.2 MiB
|
||||||
|
twitter/warm/200/goja repeat=2: CPU=3.265 ms/op, peakRSS=78.8 MiB
|
||||||
|
twitter/warm/200/goja repeat=3: CPU=3.223 ms/op, peakRSS=97.6 MiB
|
||||||
|
twitter/warm/200/moejs repeat=3: CPU=0.453 ms/op, peakRSS=76.4 MiB
|
||||||
|
twitter/warm/200/moejs repeat=4: CPU=0.453 ms/op, peakRSS=96.1 MiB
|
||||||
|
twitter/warm/200/goja repeat=4: CPU=3.276 ms/op, peakRSS=78.8 MiB
|
||||||
|
twitter/warm/200/goja repeat=5: CPU=3.201 ms/op, peakRSS=78.7 MiB
|
||||||
|
twitter/warm/200/moejs repeat=5: CPU=0.455 ms/op, peakRSS=76.7 MiB
|
||||||
|
twitter/retained/1/goja repeat=1: CPU=16.125 ms/op, peakRSS=75.2 MiB
|
||||||
|
twitter/retained/1/moejs repeat=1: CPU=11.682 ms/op, peakRSS=74.5 MiB
|
||||||
|
twitter/retained/1/moejs repeat=2: CPU=11.636 ms/op, peakRSS=74.6 MiB
|
||||||
|
twitter/retained/1/goja repeat=2: CPU=15.417 ms/op, peakRSS=75.1 MiB
|
||||||
|
twitter/retained/1/goja repeat=3: CPU=14.978 ms/op, peakRSS=74.8 MiB
|
||||||
|
twitter/retained/1/moejs repeat=3: CPU=11.520 ms/op, peakRSS=94.1 MiB
|
||||||
|
twitter/retained/1/moejs repeat=4: CPU=11.398 ms/op, peakRSS=74.6 MiB
|
||||||
|
twitter/retained/1/goja repeat=4: CPU=15.235 ms/op, peakRSS=94.5 MiB
|
||||||
|
twitter/retained/1/goja repeat=5: CPU=15.355 ms/op, peakRSS=75.3 MiB
|
||||||
|
twitter/retained/1/moejs repeat=5: CPU=11.538 ms/op, peakRSS=94.1 MiB
|
||||||
|
twitter/retained/8/goja repeat=1: CPU=19.502 ms/op, peakRSS=106.9 MiB
|
||||||
|
twitter/retained/8/moejs repeat=1: CPU=12.182 ms/op, peakRSS=93.0 MiB
|
||||||
|
twitter/retained/8/moejs repeat=2: CPU=12.171 ms/op, peakRSS=92.9 MiB
|
||||||
|
twitter/retained/8/goja repeat=2: CPU=18.439 ms/op, peakRSS=98.1 MiB
|
||||||
|
twitter/retained/8/goja repeat=3: CPU=19.251 ms/op, peakRSS=108.3 MiB
|
||||||
|
twitter/retained/8/moejs repeat=3: CPU=12.528 ms/op, peakRSS=96.6 MiB
|
||||||
|
twitter/retained/8/moejs repeat=4: CPU=12.132 ms/op, peakRSS=93.3 MiB
|
||||||
|
twitter/retained/8/goja repeat=4: CPU=19.235 ms/op, peakRSS=108.2 MiB
|
||||||
|
twitter/retained/8/goja repeat=5: CPU=18.473 ms/op, peakRSS=98.1 MiB
|
||||||
|
twitter/retained/8/moejs repeat=5: CPU=12.258 ms/op, peakRSS=93.1 MiB
|
||||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,115 @@
|
|||||||
|
=== RUN TestMoeResolveWriteback
|
||||||
|
bridge_test.go:44: Go Resource.Validate passed, name=BV1BJ4m1e7g8.真实扩展 Replay 测试(P2).1080p.mp4
|
||||||
|
--- PASS: TestMoeResolveWriteback (0.09s)
|
||||||
|
=== RUN TestBufferedReplay
|
||||||
|
=== RUN TestBufferedReplay/bilibili
|
||||||
|
=== RUN TestBufferedReplay/bilibili/goja
|
||||||
|
=== RUN TestBufferedReplay/bilibili/moejs
|
||||||
|
=== RUN TestBufferedReplay/youtube
|
||||||
|
=== RUN TestBufferedReplay/youtube/goja
|
||||||
|
=== RUN TestBufferedReplay/youtube/moejs
|
||||||
|
=== RUN TestBufferedReplay/twitter
|
||||||
|
=== RUN TestBufferedReplay/twitter/goja
|
||||||
|
=== RUN TestBufferedReplay/twitter/moejs
|
||||||
|
--- PASS: TestBufferedReplay (0.60s)
|
||||||
|
--- PASS: TestBufferedReplay/bilibili (0.18s)
|
||||||
|
--- PASS: TestBufferedReplay/bilibili/goja (0.09s)
|
||||||
|
--- PASS: TestBufferedReplay/bilibili/moejs (0.09s)
|
||||||
|
--- PASS: TestBufferedReplay/youtube (0.40s)
|
||||||
|
--- PASS: TestBufferedReplay/youtube/goja (0.21s)
|
||||||
|
--- PASS: TestBufferedReplay/youtube/moejs (0.19s)
|
||||||
|
--- PASS: TestBufferedReplay/twitter (0.02s)
|
||||||
|
--- PASS: TestBufferedReplay/twitter/goja (0.01s)
|
||||||
|
--- PASS: TestBufferedReplay/twitter/moejs (0.01s)
|
||||||
|
=== RUN TestExtensionReplay
|
||||||
|
=== RUN TestExtensionReplay/bilibili
|
||||||
|
=== RUN TestExtensionReplay/bilibili/goja
|
||||||
|
evaluation_test.go:46: {"res":{"name":"真实扩展 Replay 测试","range":false,"files":[{"name":"BV1BJ4m1e7g8.真实扩展 Replay 测试(P1).1080p.mp4","req":{"url":"blob:replay/1","rawUrl":"https://www.bilibili.com/video/BV1BJ4m1e7g8?p=1-3","labels":{"monkeyWie@bilibili":"1","bvid":"BV1BJ4m1e7g8","cid":100,"p":0,"type":"merged","quality":80,"selectedQuality":80,"resolution":"1080p"}}},{"name":"BV1BJ4m1e7g8.真实扩展 Replay 测试(P2).1080p.mp4","req":{"url":"blob:replay/2","rawUrl":"https://www.bilibili.com/video/BV1BJ4m1e7g8?p=1-3","labels":{"monkeyWie@bilibili":"1","bvid":"BV1BJ4m1e7g8","cid":101,"p":1,"type":"merged","quality":80,"selectedQuality":80,"resolution":"1080p"}}},{"name":"BV1BJ4m1e7g8.真实扩展 Replay 测试(P3).1080p.mp4","req":{"url":"blob:replay/3","rawUrl":"https://www.bilibili.com/video/BV1BJ4m1e7g8?p=1-3","labels":{"monkeyWie@bilibili":"1","bvid":"BV1BJ4m1e7g8","cid":102,"p":2,"type":"merged","quality":80,"selectedQuality":80,"resolution":"1080p"}}}]},"requests":["/x/web-interface/view","/x/web-interface/nav","/x/player/wbi/playurl","/x/web-interface/nav","/x/player/wbi/playurl","/x/web-interface/nav","/x/player/wbi/playurl"]}
|
||||||
|
=== RUN TestExtensionReplay/bilibili/moejs
|
||||||
|
evaluation_test.go:46: {"res":{"name":"真实扩展 Replay 测试","range":false,"files":[{"name":"BV1BJ4m1e7g8.真实扩展 Replay 测试(P1).1080p.mp4","req":{"url":"blob:replay/1","rawUrl":"https://www.bilibili.com/video/BV1BJ4m1e7g8?p=1-3","labels":{"monkeyWie@bilibili":"1","bvid":"BV1BJ4m1e7g8","cid":100,"p":0,"type":"merged","quality":80,"selectedQuality":80,"resolution":"1080p"}}},{"name":"BV1BJ4m1e7g8.真实扩展 Replay 测试(P2).1080p.mp4","req":{"url":"blob:replay/2","rawUrl":"https://www.bilibili.com/video/BV1BJ4m1e7g8?p=1-3","labels":{"monkeyWie@bilibili":"1","bvid":"BV1BJ4m1e7g8","cid":101,"p":1,"type":"merged","quality":80,"selectedQuality":80,"resolution":"1080p"}}},{"name":"BV1BJ4m1e7g8.真实扩展 Replay 测试(P3).1080p.mp4","req":{"url":"blob:replay/3","rawUrl":"https://www.bilibili.com/video/BV1BJ4m1e7g8?p=1-3","labels":{"monkeyWie@bilibili":"1","bvid":"BV1BJ4m1e7g8","cid":102,"p":2,"type":"merged","quality":80,"selectedQuality":80,"resolution":"1080p"}}}]},"requests":["/x/web-interface/view","/x/web-interface/nav","/x/player/wbi/playurl","/x/web-interface/nav","/x/player/wbi/playurl","/x/web-interface/nav","/x/player/wbi/playurl"]}
|
||||||
|
=== RUN TestExtensionReplay/youtube
|
||||||
|
=== RUN TestExtensionReplay/youtube/goja
|
||||||
|
evaluation_test.go:46: {"res":{"range":false,"files":[{"name":"YouTube Replay 测试.mp4","req":{"url":"https://www.youtube.com/watch?v=dQw4w9WgXcQ","rawUrl":"https://www.youtube.com/watch?v=dQw4w9WgXcQ","labels":{"monkeyWie@youtube":"1","input":"https://www.youtube.com/watch?v=dQw4w9WgXcQ","quality":"1080p","fallbackToBest":"true","type":"merged"}}}]},"requests":["/sw.js_data","/youtubei/v1/config","/youtubei/v1/player"]}
|
||||||
|
=== RUN TestExtensionReplay/youtube/moejs
|
||||||
|
evaluation_test.go:46: {"res":{"range":false,"files":[{"name":"YouTube Replay 测试.mp4","req":{"url":"https://www.youtube.com/watch?v=dQw4w9WgXcQ","rawUrl":"https://www.youtube.com/watch?v=dQw4w9WgXcQ","labels":{"monkeyWie@youtube":"1","input":"https://www.youtube.com/watch?v=dQw4w9WgXcQ","quality":"1080p","fallbackToBest":"true","type":"merged"}}}]},"requests":["/sw.js_data","/youtubei/v1/config","/youtubei/v1/player"]}
|
||||||
|
=== RUN TestExtensionReplay/twitter
|
||||||
|
=== RUN TestExtensionReplay/twitter/goja
|
||||||
|
evaluation_test.go:46: {"res":{"name":"twitter-status-1734145541599383880","files":[{"name":"twitter-status-1734145541599383880-1.jpg","req":{"url":"https://pbs.twimg.com/media/replay.jpg"}},{"name":"twitter-status-1734145541599383880-2.mp4","req":{"url":"https://video.twimg.com/1920x1080/high.mp4"}}]},"requests":["/raw/nz3ApKQM","/1.1/guest/activate.json","/raw/nz3ApKQM","/i/api/graphql/DJS3BdhUhcaEpZ7B7irJDg/TweetResultByRestId"]}
|
||||||
|
=== RUN TestExtensionReplay/twitter/moejs
|
||||||
|
evaluation_test.go:46: {"res":{"name":"twitter-status-1734145541599383880","files":[{"name":"twitter-status-1734145541599383880-1.jpg","req":{"url":"https://pbs.twimg.com/media/replay.jpg"}},{"name":"twitter-status-1734145541599383880-2.mp4","req":{"url":"https://video.twimg.com/1920x1080/high.mp4"}}]},"requests":["/raw/nz3ApKQM","/1.1/guest/activate.json","/raw/nz3ApKQM","/i/api/graphql/DJS3BdhUhcaEpZ7B7irJDg/TweetResultByRestId"]}
|
||||||
|
--- PASS: TestExtensionReplay (0.60s)
|
||||||
|
--- PASS: TestExtensionReplay/bilibili (0.17s)
|
||||||
|
--- PASS: TestExtensionReplay/bilibili/goja (0.09s)
|
||||||
|
--- PASS: TestExtensionReplay/bilibili/moejs (0.09s)
|
||||||
|
--- PASS: TestExtensionReplay/youtube (0.40s)
|
||||||
|
--- PASS: TestExtensionReplay/youtube/goja (0.21s)
|
||||||
|
--- PASS: TestExtensionReplay/youtube/moejs (0.19s)
|
||||||
|
--- PASS: TestExtensionReplay/twitter (0.02s)
|
||||||
|
--- PASS: TestExtensionReplay/twitter/goja (0.01s)
|
||||||
|
--- PASS: TestExtensionReplay/twitter/moejs (0.01s)
|
||||||
|
=== RUN TestExtensionLifecycle
|
||||||
|
=== RUN TestExtensionLifecycle/bilibili
|
||||||
|
=== RUN TestExtensionLifecycle/bilibili/goja
|
||||||
|
evaluation_test.go:110: {"res":{"name":"真实扩展 Replay 测试","range":false,"files":[{"name":"BV1BJ4m1e7g8.真实扩展 Replay 测试(P1).1080p.mp4","req":{"url":"blob:replay/5","rawUrl":"https://www.bilibili.com/video/BV1BJ4m1e7g8?p=1-3","labels":{"monkeyWie@bilibili":"1","bvid":"BV1BJ4m1e7g8","cid":100,"p":0,"type":"merged","quality":80,"selectedQuality":80,"resolution":"1080p","mergeCdnState":"{\"failed\":[{\"video\":\"https://upos-test.bilivideo.com\",\"audio\":\"https://upos-test.bilivideo.com\"}],\"retries\":1,\"current\":{\"video\":\"https://backup.example.com\",\"audio\":\"https://upos-test.bilivideo.com\"}}"}}},{"name":"BV1BJ4m1e7g8.真实扩展 Replay 测试(P2).1080p.mp4","req":{"url":"blob:replay/7","rawUrl":"https://www.bilibili.com/video/BV1BJ4m1e7g8?p=1-3","labels":{"monkeyWie@bilibili":"1","bvid":"BV1BJ4m1e7g8","cid":101,"p":1,"type":"merged","quality":80,"selectedQuality":80,"resolution":"1080p","mergeCdnState":"{\"failed\":[{\"video\":\"https://upos-test.bilivideo.com\",\"audio\":\"https://upos-test.bilivideo.com\"}],\"retries\":1,\"current\":{\"video\":\"https://backup.example.com\",\"audio\":\"https://upos-test.bilivideo.com\"}}"}}},{"name":"BV1BJ4m1e7g8.真实扩展 Replay 测试(P3).1080p.mp4","req":{"url":"blob:replay/9","rawUrl":"https://www.bilibili.com/video/BV1BJ4m1e7g8?p=1-3","labels":{"monkeyWie@bilibili":"1","bvid":"BV1BJ4m1e7g8","cid":102,"p":2,"type":"merged","quality":80,"selectedQuality":80,"resolution":"1080p","mergeCdnState":"{\"failed\":[{\"video\":\"https://upos-test.bilivideo.com\",\"audio\":\"https://upos-test.bilivideo.com\"}],\"retries\":1,\"current\":{\"video\":\"https://backup.example.com\",\"audio\":\"https://upos-test.bilivideo.com\"}}"}}}]},"continued":3,"requests":["/x/web-interface/view","/x/web-interface/nav","/x/player/wbi/playurl","/x/web-interface/nav","/x/player/wbi/playurl","/x/web-interface/nav","/x/player/wbi/playurl","/x/web-interface/nav","/x/player/wbi/playurl","/x/web-interface/nav","/x/player/wbi/playurl","/x/web-interface/nav","/x/player/wbi/playurl","/x/web-interface/nav","/x/player/wbi/playurl","/x/web-interface/nav","/x/player/wbi/playurl","/x/web-interface/nav","/x/player/wbi/playurl"]}
|
||||||
|
=== RUN TestExtensionLifecycle/bilibili/moejs
|
||||||
|
evaluation_test.go:110: {"res":{"name":"真实扩展 Replay 测试","range":false,"files":[{"name":"BV1BJ4m1e7g8.真实扩展 Replay 测试(P1).1080p.mp4","req":{"url":"blob:replay/5","rawUrl":"https://www.bilibili.com/video/BV1BJ4m1e7g8?p=1-3","labels":{"monkeyWie@bilibili":"1","bvid":"BV1BJ4m1e7g8","cid":100,"p":0,"type":"merged","quality":80,"selectedQuality":80,"resolution":"1080p","mergeCdnState":"{\"failed\":[{\"video\":\"https://upos-test.bilivideo.com\",\"audio\":\"https://upos-test.bilivideo.com\"}],\"retries\":1,\"current\":{\"video\":\"https://backup.example.com\",\"audio\":\"https://upos-test.bilivideo.com\"}}"}}},{"name":"BV1BJ4m1e7g8.真实扩展 Replay 测试(P2).1080p.mp4","req":{"url":"blob:replay/7","rawUrl":"https://www.bilibili.com/video/BV1BJ4m1e7g8?p=1-3","labels":{"monkeyWie@bilibili":"1","bvid":"BV1BJ4m1e7g8","cid":101,"p":1,"type":"merged","quality":80,"selectedQuality":80,"resolution":"1080p","mergeCdnState":"{\"failed\":[{\"video\":\"https://upos-test.bilivideo.com\",\"audio\":\"https://upos-test.bilivideo.com\"}],\"retries\":1,\"current\":{\"video\":\"https://backup.example.com\",\"audio\":\"https://upos-test.bilivideo.com\"}}"}}},{"name":"BV1BJ4m1e7g8.真实扩展 Replay 测试(P3).1080p.mp4","req":{"url":"blob:replay/9","rawUrl":"https://www.bilibili.com/video/BV1BJ4m1e7g8?p=1-3","labels":{"monkeyWie@bilibili":"1","bvid":"BV1BJ4m1e7g8","cid":102,"p":2,"type":"merged","quality":80,"selectedQuality":80,"resolution":"1080p","mergeCdnState":"{\"failed\":[{\"video\":\"https://upos-test.bilivideo.com\",\"audio\":\"https://upos-test.bilivideo.com\"}],\"retries\":1,\"current\":{\"video\":\"https://backup.example.com\",\"audio\":\"https://upos-test.bilivideo.com\"}}"}}}]},"continued":3,"requests":["/x/web-interface/view","/x/web-interface/nav","/x/player/wbi/playurl","/x/web-interface/nav","/x/player/wbi/playurl","/x/web-interface/nav","/x/player/wbi/playurl","/x/web-interface/nav","/x/player/wbi/playurl","/x/web-interface/nav","/x/player/wbi/playurl","/x/web-interface/nav","/x/player/wbi/playurl","/x/web-interface/nav","/x/player/wbi/playurl","/x/web-interface/nav","/x/player/wbi/playurl","/x/web-interface/nav","/x/player/wbi/playurl"]}
|
||||||
|
=== RUN TestExtensionLifecycle/youtube
|
||||||
|
=== RUN TestExtensionLifecycle/youtube/goja
|
||||||
|
evaluation_test.go:110: {"res":{"range":false,"files":[{"name":"YouTube Replay 测试.mp4","req":{"url":"blob:replay/1","rawUrl":"https://www.youtube.com/watch?v=dQw4w9WgXcQ","labels":{"monkeyWie@youtube":"1","input":"https://www.youtube.com/watch?v=dQw4w9WgXcQ","quality":"1080p","fallbackToBest":"true","type":"merged","retried":"1"}}}]},"continued":1,"requests":["/sw.js_data","/youtubei/v1/config","/youtubei/v1/player"]}
|
||||||
|
=== RUN TestExtensionLifecycle/youtube/moejs
|
||||||
|
evaluation_test.go:110: {"res":{"range":false,"files":[{"name":"YouTube Replay 测试.mp4","req":{"url":"blob:replay/1","rawUrl":"https://www.youtube.com/watch?v=dQw4w9WgXcQ","labels":{"monkeyWie@youtube":"1","input":"https://www.youtube.com/watch?v=dQw4w9WgXcQ","quality":"1080p","fallbackToBest":"true","type":"merged","retried":"1"}}}]},"continued":1,"requests":["/sw.js_data","/youtubei/v1/config","/youtubei/v1/player"]}
|
||||||
|
=== RUN TestExtensionLifecycle/twitter
|
||||||
|
=== RUN TestExtensionLifecycle/twitter/goja
|
||||||
|
evaluation_test.go:110: {"res":{"name":"twitter-status-1734145541599383880","files":[{"name":"twitter-status-1734145541599383880-1.jpg","req":{"url":"https://pbs.twimg.com/media/replay.jpg"}},{"name":"twitter-status-1734145541599383880-2.mp4","req":{"url":"https://video.twimg.com/1920x1080/high.mp4"}}]},"continued":0,"requests":["/raw/nz3ApKQM","/1.1/guest/activate.json","/raw/nz3ApKQM","/i/api/graphql/DJS3BdhUhcaEpZ7B7irJDg/TweetResultByRestId"]}
|
||||||
|
=== RUN TestExtensionLifecycle/twitter/moejs
|
||||||
|
evaluation_test.go:110: {"res":{"name":"twitter-status-1734145541599383880","files":[{"name":"twitter-status-1734145541599383880-1.jpg","req":{"url":"https://pbs.twimg.com/media/replay.jpg"}},{"name":"twitter-status-1734145541599383880-2.mp4","req":{"url":"https://video.twimg.com/1920x1080/high.mp4"}}]},"continued":0,"requests":["/raw/nz3ApKQM","/1.1/guest/activate.json","/raw/nz3ApKQM","/i/api/graphql/DJS3BdhUhcaEpZ7B7irJDg/TweetResultByRestId"]}
|
||||||
|
--- PASS: TestExtensionLifecycle (0.62s)
|
||||||
|
--- PASS: TestExtensionLifecycle/bilibili (0.20s)
|
||||||
|
--- PASS: TestExtensionLifecycle/bilibili/goja (0.11s)
|
||||||
|
--- PASS: TestExtensionLifecycle/bilibili/moejs (0.09s)
|
||||||
|
--- PASS: TestExtensionLifecycle/youtube (0.39s)
|
||||||
|
--- PASS: TestExtensionLifecycle/youtube/goja (0.20s)
|
||||||
|
--- PASS: TestExtensionLifecycle/youtube/moejs (0.19s)
|
||||||
|
--- PASS: TestExtensionLifecycle/twitter (0.02s)
|
||||||
|
--- PASS: TestExtensionLifecycle/twitter/goja (0.01s)
|
||||||
|
--- PASS: TestExtensionLifecycle/twitter/moejs (0.01s)
|
||||||
|
=== RUN TestFrozenExtensionReplay
|
||||||
|
=== RUN TestFrozenExtensionReplay/bilibili
|
||||||
|
frozen_test.go:13: {"res":{"name":"真实扩展 Replay 测试","range":false,"files":[{"name":"BV1BJ4m1e7g8.真实扩展 Replay 测试(P1).1080p.mp4","req":{"url":"blob:replay/1","rawUrl":"https://www.bilibili.com/video/BV1BJ4m1e7g8?p=1-3","labels":{"monkeyWie@bilibili":"1","bvid":"BV1BJ4m1e7g8","cid":100,"p":0,"type":"merged","quality":80,"selectedQuality":80,"resolution":"1080p"}}},{"name":"BV1BJ4m1e7g8.真实扩展 Replay 测试(P2).1080p.mp4","req":{"url":"blob:replay/2","rawUrl":"https://www.bilibili.com/video/BV1BJ4m1e7g8?p=1-3","labels":{"monkeyWie@bilibili":"1","bvid":"BV1BJ4m1e7g8","cid":101,"p":1,"type":"merged","quality":80,"selectedQuality":80,"resolution":"1080p"}}},{"name":"BV1BJ4m1e7g8.真实扩展 Replay 测试(P3).1080p.mp4","req":{"url":"blob:replay/3","rawUrl":"https://www.bilibili.com/video/BV1BJ4m1e7g8?p=1-3","labels":{"monkeyWie@bilibili":"1","bvid":"BV1BJ4m1e7g8","cid":102,"p":2,"type":"merged","quality":80,"selectedQuality":80,"resolution":"1080p"}}}]},"requests":["/x/web-interface/view","/x/web-interface/nav","/x/player/wbi/playurl","/x/web-interface/nav","/x/player/wbi/playurl","/x/web-interface/nav","/x/player/wbi/playurl"]}
|
||||||
|
=== RUN TestFrozenExtensionReplay/youtube
|
||||||
|
frozen_test.go:13: {"res":{"range":false,"files":[{"name":"YouTube Replay 测试.mp4","req":{"url":"https://www.youtube.com/watch?v=dQw4w9WgXcQ","rawUrl":"https://www.youtube.com/watch?v=dQw4w9WgXcQ","labels":{"monkeyWie@youtube":"1","input":"https://www.youtube.com/watch?v=dQw4w9WgXcQ","quality":"1080p","fallbackToBest":"true","type":"merged"}}}]},"requests":["/sw.js_data","/youtubei/v1/config","/youtubei/v1/player"]}
|
||||||
|
=== RUN TestFrozenExtensionReplay/twitter
|
||||||
|
frozen_test.go:13: {"res":{"name":"twitter-status-1734145541599383880","files":[{"name":"twitter-status-1734145541599383880-1.jpg","req":{"url":"https://pbs.twimg.com/media/replay.jpg"}},{"name":"twitter-status-1734145541599383880-2.mp4","req":{"url":"https://video.twimg.com/1920x1080/high.mp4"}}]},"requests":["/raw/nz3ApKQM","/1.1/guest/activate.json","/raw/nz3ApKQM","/i/api/graphql/DJS3BdhUhcaEpZ7B7irJDg/TweetResultByRestId"]}
|
||||||
|
--- PASS: TestFrozenExtensionReplay (0.29s)
|
||||||
|
--- PASS: TestFrozenExtensionReplay/bilibili (0.08s)
|
||||||
|
--- PASS: TestFrozenExtensionReplay/youtube (0.19s)
|
||||||
|
--- PASS: TestFrozenExtensionReplay/twitter (0.01s)
|
||||||
|
=== RUN TestAsyncHTTP
|
||||||
|
=== RUN TestAsyncHTTP/goja
|
||||||
|
http_test.go:46: abort rejection: ReferenceError: DOMException is not defined
|
||||||
|
http_test.go:56: default abort probe: AbortError
|
||||||
|
=== RUN TestAsyncHTTP/moejs
|
||||||
|
http_test.go:46: abort rejection: Error: evaluation cancel
|
||||||
|
http_test.go:56: default abort probe: AbortError
|
||||||
|
--- PASS: TestAsyncHTTP (0.03s)
|
||||||
|
--- PASS: TestAsyncHTTP/goja (0.02s)
|
||||||
|
--- PASS: TestAsyncHTTP/moejs (0.02s)
|
||||||
|
=== RUN TestHostInterop
|
||||||
|
=== RUN TestHostInterop/goja
|
||||||
|
interop_test.go:65: Go URL=after, Go res=map[files:[map[name:video.mp4]]], JS method=function
|
||||||
|
=== RUN TestHostInterop/moejs
|
||||||
|
interop_test.go:65: Go URL=before, Go res=map[], JS method=undefined
|
||||||
|
--- PASS: TestHostInterop (0.00s)
|
||||||
|
--- PASS: TestHostInterop/goja (0.00s)
|
||||||
|
--- PASS: TestHostInterop/moejs (0.00s)
|
||||||
|
=== RUN TestFrozenCompatibility
|
||||||
|
interop_test.go:80: TypeError: Cannot modify property '__probe' of shared intrinsic [object Array]
|
||||||
|
--- PASS: TestFrozenCompatibility (0.00s)
|
||||||
|
=== RUN TestLiveResolve
|
||||||
|
live_test.go:14: set GOPEED_MOEJS_LIVE=1 to contact public endpoints
|
||||||
|
--- SKIP: TestLiveResolve (0.00s)
|
||||||
|
=== RUN TestResourceWorker
|
||||||
|
resource_worker_test.go:139: process resource measurement worker
|
||||||
|
--- SKIP: TestResourceWorker (0.00s)
|
||||||
|
PASS
|
||||||
|
ok github.com/GopeedLab/gopeed/experiments/moejs 3.094s
|
||||||
File diff suppressed because it is too large.
Load diff
Reference in new issue
Block a user