perf(reader): M29 书架扫描缓存 + 行数多时关圆角容器(回书架 3.4s→0.03s,滚动 52ms→19ms)
真机(0.8.48 / reader 0.1.1 基线,同机同字库 ztest 实测): - 从阅读页返回书架:3435ms(3259–3531)→ 33ms(24–54)。根因是 shelf_on_enter 无条件 scan_books():exFAT 全量扫描 434 目录 = 3.1s。改为进程内缓存(首次进入才扫,顶栏 「刷新」强制重扫);truncated/depth_skipped 提示语义不变(首次扫描时算好并保留)。 行为变化:新进 Books/ 的书、刚读完那本书的「最近阅读置顶」需点一次「刷新」才更新。 - 书架滑动每步(62px,含 widget_draw + flush):51.9–56.2ms → 19.3–19.9ms。 行数 > 200 时 meow_listview_set_container(0)(扁平行),≤200 行仍用 MD3 圆角卡; 圆角卡走 meow_gfx_fill_round 逐像素 rr_inside(464×54 一张 3.8–6.4ms ×11 行)。 - 首次进书架仍需扫一次(3497ms,含 3157ms 扫描);595 本全可见、format/folder 分组不变。 另加 test/shelf_bench_ondev.c(真机耗时基准,不进 mpk)与 build_reader.sh 的编译步骤; app.json 0.1.1/2 → 0.1.2/3。未做(按塔砍范围):字体路径记忆化、首屏只渲染当前页、 自绘行、mtime 失效检测。
This commit is contained in:
1 parent
288c133efc
commit
bece9848e7
5 files changed
+151
-6
No files matched your search
@@ -0,0 +1,114 @@
|
||||
/* test/shelf_bench_ondev.c — 真机耗时基准(不进发行包,不参与 mpk)。
|
||||
*
|
||||
* 目的:在**同一台设备、同一字库/主题环境**下量 App 的同步耗时,用来给书架缓存 /
|
||||
* 行自绘 / 开书路径做前后对比(宿主数字不算数)。
|
||||
*
|
||||
* 只调 App/SDK 公共入口(与 app.c 的调用顺序一致),不复制任何内部实现:
|
||||
* meow_ui_init → 建三页 → push 书架(= 首次进书架,含扫描)
|
||||
* → push/pop 阅读页 ×N(= 从阅读页返回书架)
|
||||
* → shelf_on_swipe ×N(= 书架滑动,含 widget_draw + flush 上屏)
|
||||
* → reader_open + push 阅读页(= 点书开读首屏)、翻页
|
||||
*
|
||||
* 用法(设备):shelf_bench_ondev [book1 [book2 ...]]
|
||||
* 输出:`BENCH <key> <min>-<max> (avg ...)` 行,ms 为毫秒(设备时钟 10ms 分辨率,
|
||||
* 单次量用多轮取样给区间;批量操作用「总时长/次数」给出平均值)。
|
||||
*/
|
||||
#include "reader_internal.h"
|
||||
#include "app/shelf_model.h"
|
||||
#include "meow_ui_internal.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
static uint64_t now_ms(void) { return meow_ui_time_ms(); }
|
||||
|
||||
static void bench_scan(void)
|
||||
{
|
||||
static shelf_book books[SHELF_MAX_BOOKS];
|
||||
shelf_scan_report rep;
|
||||
uint64_t t0 = now_ms();
|
||||
int n = shelf_scan_books(READER_SD_ROOT "/Books", books, SHELF_MAX_BOOKS, NULL, &rep);
|
||||
uint64_t t1 = now_ms();
|
||||
printf("BENCH scan_ms %llu (n=%d truncated=%d depth_skipped=%d root_missing=%d)\n",
|
||||
(unsigned long long)(t1 - t0), n, rep.truncated, rep.depth_skipped, rep.root_missing);
|
||||
fflush(stdout);
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
meow_ui_opts o = { 480, 720 };
|
||||
if (meow_ui_init(&o) != 0) { printf("BENCH init_fail\n"); return 1; }
|
||||
meow_theme_add_listener(NULL);
|
||||
|
||||
bench_scan(); /* 纯扫描基线(不建 UI) */
|
||||
|
||||
shelf_view_create();
|
||||
reader_view_create();
|
||||
settings_view_create();
|
||||
|
||||
/* ① 首次进书架(新进程:含全量扫描 + 建控件 + 首帧上屏) */
|
||||
uint64_t t0 = now_ms();
|
||||
meow_view_page_push(ACT_SHELF);
|
||||
uint64_t t1 = now_ms();
|
||||
printf("BENCH shelf_first_enter_ms %llu\n", (unsigned long long)(t1 - t0));
|
||||
|
||||
/* ② 从阅读页返回书架:push 阅读页(不等书)→ pop 回书架;连做 5 次给区间 */
|
||||
unsigned long long rmin = 0, rmax = 0, rsum = 0;
|
||||
for (int i = 0; i < 5; i++) {
|
||||
meow_view_page_push(ACT_READER);
|
||||
uint64_t a = now_ms();
|
||||
meow_view_page_pop();
|
||||
uint64_t b = now_ms();
|
||||
uint64_t d = b - a;
|
||||
if (i == 0 || d < rmin) rmin = d;
|
||||
if (i == 0 || d > rmax) rmax = d;
|
||||
rsum += d;
|
||||
}
|
||||
printf("BENCH shelf_return_ms %llu-%llu (avg %llu)\n",
|
||||
rmin, rmax, rsum / 5);
|
||||
|
||||
/* ③ 书架滑动:每步 62px(与 survey 同口径:scroll 62 + widget_draw + flush) */
|
||||
for (int batch = 0; batch < 3; batch++) {
|
||||
uint64_t a = now_ms();
|
||||
for (int i = 0; i < 30; i++) shelf_on_swipe(MEOW_SWIPE_UP, 0, 62);
|
||||
uint64_t b = now_ms();
|
||||
printf("BENCH shelf_scroll_step_ms %.1f (batch %d: 30 steps %llu ms)\n",
|
||||
(double)(b - a) / 30.0, batch, (unsigned long long)(b - a));
|
||||
for (int i = 0; i < 30; i++) shelf_on_swipe(MEOW_SWIPE_DOWN, 0, 62); /* 回到顶部 */
|
||||
}
|
||||
fflush(stdout);
|
||||
|
||||
/* ④ 开书首屏 / 翻页(argv 给书路径;不给则跳过) */
|
||||
for (int i = 1; i < argc; i++) {
|
||||
uint64_t a = now_ms();
|
||||
int rc = reader_open(argv[i]);
|
||||
uint64_t b = now_ms();
|
||||
if (rc != 0) { printf("BENCH open_fail %s\n", argv[i]); continue; }
|
||||
meow_view_page_push(ACT_READER);
|
||||
uint64_t c = now_ms();
|
||||
printf("BENCH open_ms %llu (reader_open %llu + page_push %llu) %s\n",
|
||||
(unsigned long long)(c - a), (unsigned long long)(b - a),
|
||||
(unsigned long long)(c - b), argv[i]);
|
||||
/* 翻页:reader_page_key 置 pending → reader_on_tick 消费(同步段=turn+refill+redraw)
|
||||
* 轮数由 MEOW_BENCH_TURNS 控制(0=不翻页 → 用于「开书不翻页进度文件不变」回归)。 */
|
||||
const char *et = getenv("MEOW_BENCH_TURNS");
|
||||
int nturns = et && et[0] ? atoi(et) : 4;
|
||||
unsigned long long tmin = 0, tmax = 0, tsum = 0;
|
||||
for (int p = 0; p < nturns; p++) {
|
||||
reader_page_key(1);
|
||||
uint64_t x = now_ms();
|
||||
reader_on_tick(now_ms());
|
||||
uint64_t y = now_ms();
|
||||
uint64_t d = y - x;
|
||||
if (p == 0 || d < tmin) tmin = d;
|
||||
if (p == 0 || d > tmax) tmax = d;
|
||||
tsum += d;
|
||||
}
|
||||
printf("BENCH turn_ms %llu-%llu (avg %llu) %s\n", tmin, tmax, nturns ? tsum / nturns : 0, argv[i]);
|
||||
meow_view_page_pop();
|
||||
fflush(stdout);
|
||||
}
|
||||
|
||||
meow_ui_shutdown();
|
||||
return 0;
|
||||
}
|
||||
Reference in new issue
Block a user