scrapbox.Project.pagesはキャッシュして使
scrapbox.Project.pagesはgetterであり、アクセスするたびにscrapbox内部のページリストがdeep cloneされる
一旦生成したpagesを使い回す設計にしないといけない
例
振り返り(takker-workflow@0.0.1)を自動生成するUserScriptにあった↓のコードがUIをblockingしてしまっていた
code:js
// 生成する振り返りページの日付リスト
const dates = eachDayOfInterval(interval).filter((date) => {
const title = reviewTitle(date);
const page = scrapbox.Project.pages.find((page) => page.title === title);
return !page || !page.exists;
});
2023-03-10時点でeachDayOfInterval(interval).length === 129だったため、129回もクソデカ配列の生成と破棄を繰り返すことになっていた
メモリが死んでしまう!
電力も食う
2022-11-03時点では配列の長さが1だったため、気づかなかったのだろう
日が経過するに連れてfilterする回数が増え、だんだんUIブロックが気になるようになってきた
日刊記録sheetを自動生成するUserScriptにも同様の記述があり、4秒程度かかっていた
これにより、いつもscrapboxを立ち上げるたびに約10秒もUI threadがblockingされていた
当初はtop-level awaitのせいかと思って対策を施したが、全く改善されなかった
2023-03-10にChrome Developer Toolsを使ってmobile版scrapboxの起動状況を調べた結果、scrapbox.Project.pagesの生成が原因だとわかった
この事情はscrapbox.Page.linesも同じ
こっちはページ内の行数が少なければ大きな問題にならない
#2023-03-10 14:16:06