長いページから出るときが重い
日記ページ重すぎて遷移に時間かかるSummer498.icon
切り出しの基準を考えたほうがいいなこれ
切り出し基準に達したときに警告するCSSはあってもよさそう
日記ページが一定行数を超えると自動的に並列日記を作るとかnishio.icon
書き込む時の分ける大変さを考えると、書き込んだ後に切り出したいなぁSummer498.icon
行をはやみ切り出しされる井戸日記われても末に合はむとぞ思ふcFQ2f7LRuLYP.icon
並列日記が一時期流行ってたinajob.iconcFQ2f7LRuLYP.icon これは書き込むときに分ける大変さがあるSummer498.icon
重くない (別タブが開く)
日記ページが重くなる原因を探るSummer498.icon
文が多いからか
リンクが多いからか
個人プロジェクトに文が多いページとリンクが多いページを作って実験する
重さのファクターは井戸端固有のものにある
以下のページを個人プロジェクトに作成。結果は重くない
リンク: 既存の全ページ (210ページ) にリンクするページ
アイコン記法でのリンクも貼ったのでリンク数は420
被リンク: 30ページからリンクされてるページ
2hop-link: 作るのがめんどくさいTODO
井戸端固有
井戸端のSummer498.iconの UserScript を無効化
重いページは重いまま (原因ではない)
井戸端の bundled CSS を個人プロジェクトにコピー
ちょっと重い
重いページ$ \cal H_{\rm eavy}から別のページに遷移する時が重いなSummer498.icon
入るときに重いんじゃなくて、出るときに重いのが謎すぎる
消すのに時間がかかっている?
「井戸端」のボタンを押してHome に戻る時は重くない
重くない (というか別タブが開く)
同一タブ内で遷移するのに時間がかかるな
外部リンクは別タブなので重くない
この大量にあるDOMが原因かと思ってたMijinko_SD.icon
https://gyazo.com/61b3ac18672c1205066f2d212b4596a6
そのページは離脱時は日記の離脱時ほど重くないSummer498.icon
読み込み時は日記の読み込み時より重いかも
スマホで開いたら全てのページが重たいからよくわからん
とりあえず今はこれだと思ってるSummer498.icon
前も言及されていた気がするが、やはり長いページは入るときではなく出るときが重いyosider.icon
なんでだろう
開発コンソールのパフォーマンス測定をやってみるとわかりそうtakker.icon ページを出る時に一番時間を食っている函数を特定する
UserScriptの可能性もある
もしそうならそれはtakker.icon製の疑いが高い
UserScript 全部切って試しても出る時重かったから多分違うSummer498.icon
https://gyazo.com/c2965c6ad8874a4c84c60e8e8f4420deSummer498.icon
removeChild でほとんどの時間を食ってる
へぇ~~yosider.icon
そもそも40秒以上かかっている…!?
全体で50秒位でしたSummer498.icon
そんなことだろうという感じはあったけど
ページから抜けるときにページコンテンツのDOMを全部消してる?
何でそんなプログラムになってるんだろう
仮想DOMの差分検知が最悪計算量になるパターンなのかもtakker.icon 差分検知で全てのDOMを一個ずつ消すプロセスを採用されてしまっているなら、これで対処可能かもtakker.icon
code:js
scrapbox.addListener("page:changed", () => {
const lines = document.getElementById("editor")
.getElementsByClassName("lines")?.0; if (lines) lines.textContent = "";
});
これだと長時間かけて遷移した後に Script が起動されて遷移後のページが(見た目だけ)真っ白になりますねSummer498.icon
after change ではなく before change にラインを削除する処理を挟みたいんだろうな~って思って調べているがそれらしいのが見つからない
興味深い。JSでDOM再構成の話が速いという文脈で載っている
今は遅いという文脈でJSでDOM再構成の話をしているのと対象的
あー、タイミングそこなのかtakker.icon
別の方法を使わないとだめか
全部のリンクに onClicked イベントリスナを追加するのを思いついた。入るときに重くなりそう。Summer498.icon
リンクがクリックされた時にページのコンテンツを全部消す
消した後にリンク遷移が行われるかは謎。
最悪リンク遷移時のDOMいじりとコンテンツ消しが同時に走ってぶつかる可能性
https://gyazo.com/3b4e3e5f3b752daf3e056ee4e89c9643wogikaze.icon
先に消しておいてもぶつかった
remove の直前に取ってくる動作じゃないのかSummer498.icon
こんなの作ってみたけど重いのは解消されていないSummer498.icon
code:scripts.js
scrapbox.addListener("page:changed", () => {
const anchors = document.getElementById("editor")
.getElementsByTagName("a");
...anchors.forEach(e=>{e.onclick=()=>{ // s/onClick/onclick/g const lines = document.getElementById("editor")
.getElementsByClassName("lines")?.0; if (lines) lines.textContent = "";
}});
});
他に登録されているevent listenerを削除してしまう(はず)
もしかして意図的に削除してる?
いや、雑に書き換えてるだけSummer498.icon
今気づいたけど、s/onClick/onclick/g だったtakker.icon
何語かと思ったけど、sedコマンドらしい。 Vim.icon か。Summer498.icon 解消されてないのはそもそもevent listenerが登録されていないのが理由かもしれない
これはヒドイwwwSummer498.icon
じゃ、ダメなコードということでSummer498.icon
$(".line").slice(1)[1].remove()で一行だけ消した場合でもエラー出るwogikaze.icon
今重いことに気が付いた!!wogikaze.icon
日記から移動しようとしたときに2秒ぐらいかかってるのこれか~
2023/07/28のページから移動するとき50秒ぐらいかかりませんか?Summer498.icon https://gyazo.com/bce92b4b2b0dcb9adf84208f2530d443
https://gyazo.com/c74449a3cbb5dbf454a8c36520b79912
15秒くらいか~Summer498.icon
ここはCPUの性能依存ぽい?wogikaze.icon
Summer498.icon(50秒)のCPUはAMD Ryzen 7 4800H with Radeon Graphics (2.90 GHz, 8コア) wogikaze.icon(15秒) AMD Ryzen 5 5500
20,000
...誤差では?
というかSummer498.iconのCPUの稼働率が全然上がってないからボトルネックそこじゃない気がする
なんもわからんので全部display:noneしてやれwogikaze.icon
code:js
scrapbox.addListener("page:changed", () => {
const anchors = document.getElementById("editor")
.getElementsByTagName("a");
...anchors.forEach(e=>{e.onclick=()=>{ // s/onClick/onclick/g $(".line").css("display","none")
}});
});
それ DOM 消えてないんじゃない?Summer498.icon
スタイルの再計算が重いなら計算しないように..みたいなwogikaze.icon
てか重い原因関連ページリストって言ってたじゃんwogikaze.icon
ならリスト消せばいいじゃん
$("related-page-list").remove()
移動したときに再追加されないのでx
多いのは2hopだから2hopだけ消そう
$(".links-2-hop").remove()
結局こっちも消したら2回遷移でエラーでちゃうwogikaze.icon
なんか微妙だからlineのほうも非表示にしとこ(意味あるのかはわからない)
$(".links-2-hop").remove()
$(".line").css("display","none")
https://gyazo.com/2e0e3ab04d33a45bfe7f03958fbd3575
TODO:関連ページリストをクリックしたときは動いていないので
s/document.getElementById("editor").getElementsByTagName("a");/document.getElementsByTagName("a")
マシになった気がするwogikaze.icon
https://gyazo.com/1d6aa6067690dd17b574a115d965da01
まともに解決するには、ReactのDOM更新algorithmに修正を加えるしかないtakker.icon Scrapbox 君 React で動いてたのねSummer498.icon
長いページから他のページに移動するとき、同じタブでページ遷移せず新しいタブで開くと重くないyosider.icon