javascriptでクソデカ文字列をsubstringするとクソ遅い

とある環境で50MBのファイル処理がクソ遅いって言われて調べた時の話

現代のPCで50MB読み込んだだけで遅くなるか?ってReadSyncだけのコードで調べてみたら一瞬で終わって、じゃあそのあとの処理か?と調べた時の話

めちゃくちゃサブストリングするコードでこれ遅いんじゃね?ってやってみたら結構遅かった

const fs = require("fs")

var foo = fs.readFileSync("1MB.txt").toString()

var substStart = performance.now()
const START = 1024*5
for (let index = 0; index < 100000; index++) {
    var bar = foo.substring(START+index*100,START+index*100+100)
}

var substEnd = performance.now()

console.log({elapsed:substEnd-substStart})
# 1MB
{elaps:3.029}
# 100MB
{elaps:11.655}

計測方法の妥当性とか十万回で13秒なら割ととかどう言うsubstrateしてんだよとか思うコードだけど目的はサイズで遅くなることの裏付けなので目を瞑ってほしい

クソデカ配列なのでそれを操作してたらそりゃ重いかはあったけど、部分切り出しかつ切り出し後サイズ同じだしどうなんだろうと思ったけど、元サイズに結構引っ張られる様子

STARTは切り出し位置で処理時間変わるんじゃねえかなって試した時の残骸。変わらなかった

回数とか切り出しサイズとか明らかオーバーしてるけど計測はできたからよし

処理時間は雑に切り捨て。人の環境でとってもらったやつだから正確な数値をもらってない

クソデカ文字列をsubstringしまくるコードを書いていたら多分遅いんで気を付けた方がいい