
前提・実現したいこと
ブラウザ(Chrome,FF)上でJavaScriptの<文字列>.slice()を動かしたときのコストについて、同一文字列同一引数だった場合に2度目以降が高速であることについて疑問を解消したいです。
発生している問題・エラーメッセージ
同一の文字列に対して同一の引数でslice()を実行すると、2度目以降が高速になります。
これがなぜなのかを知りたいです。
1度メモリ上に展開した文字列リテラルを再参照できる仕組みがあるのだろうか?と考えていますが、それが同一条件で実行するFunctionをキャッシュしているのか、生成されるべき文字列リテラルと今持っている文字列リテラルマップ(なんてあるのか・・・?)を照合しているのか、JavaScript言語の仕様なのか・・・
### Chrome time: 5.348876953125ms time: 0.005126953125ms time: 0.001708984375ms time: 0.002197265625ms time: 0.001953125ms time: 0.002197265625ms time: 0.0009765625ms time: 0.001708984375ms time: 0.003173828125ms time: 0.002197265625ms ### Firefox time: 10ms time: 0ms * 2回 time: 2ms time: 0ms * 4回 time: 2ms time: 0ms
該当のソースコード
文字列を生成して、同じ文字列に対して同じsliceを10回繰り返します。2回目以降早くなります。
javascript
1// str準備 2let str = "" 3for (let i = 0; i < 1000000; i++) { 4 str += i % 10; 5} 6 7//本題 8for (let i = 0; i < 10; i++) { 9 console.time("time") 10 const slc = str.slice(0, str.length / 10); 11 console.timeEnd("time") 12}
試したこと
str
を再生成して実行すると、同様に1度目は低速、2度目以降高速になります。- 実行後、以下を実行してもやはり高速でした
JavaScript
1console.time("wow") 2str.slice(0, 10000*10) 3console.timeEnd("wow")
補足情報(FW/ツールのバージョンなど)
- ブラウザ
-- Chrome 65.0.3325.181(Official Build) (64 ビット)
-- Firefox 59.0.2 (64-bit)
- OS
-- Windows 10 Home
- CPU
-- Core i5
- Memory
-- 8GB

回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/04/10 00:53
退会済みユーザー
2018/04/10 00:57
2018/04/10 00:59
2018/04/10 00:59
退会済みユーザー
2018/04/10 01:04
退会済みユーザー
2018/04/10 01:18 編集
2018/04/10 01:24
2018/04/10 01:24
2018/04/10 01:28
退会済みユーザー
2018/04/10 01:30
退会済みユーザー
2018/04/10 01:32
2018/04/10 01:33
退会済みユーザー
2018/04/10 01:40
2018/04/10 01:43
退会済みユーザー
2018/04/10 01:50
退会済みユーザー
2018/04/10 01:52
2018/04/10 01:52
退会済みユーザー
2018/04/10 01:54
2018/04/10 01:57
退会済みユーザー
2018/04/10 02:04