LoginSignup
2
0

More than 1 year has passed since last update.

for文の速度が遅いとき(一応jsの場合)

Last updated at Posted at 2021-05-28

ネストされたプロパティはfor文の外で参照する

当たり前だったかもしれませんが初心者はこういうことに気づかないと思うので。
自分はこれで9000ms→20msになりました。(約10000回のループでした)
for文の中で参照するとfor文が繰り返されるたびに参照します。
for文の前で参照すると変数に代入された結果がキャッシュとして使われるので参照は1回ですみます。

※includes()を使っていますがこれは配列の中に指定した要素があるかを検索するものです。ある場合はtrue、ない場合はfalseを返します。


悪い例:
for (let i = 0; i < obj.array.length; i++ | 0) {
        if (List1.includes(nest1.nest2.nest3[i])) {
          if (List2.includes(nest4.nest5.nest6[i])) {
            if (List3.includes(nest7.nest8.nest9[i])) {
             ・・・

改善後:
let a = nest1.nest2.nest3;
let b = nest4.nest5.nest6;
let c = nest7.nest8.nest9;
let len = obj.array.length;

for (let i = 0; i < len; i++ | 0) {
        if (List1.includes(a[i])) {
          if (List2.includes(b[i])) {
            if (List3.includes(c[i])) {
             ・・・

//ちなみに以下のように書き換えたらスッキリするかもしれないが速度的には大差ない
for (let i = 0; i < len; i++ | 0) {
  if (List1.includes(a[i]) && List2.includes(b[i]) && List3.includes(c[i])) {

追記

たとえネストされていなくても大きな配列を扱う場合は先に変数に入れたほうが速いです。
以下はnuxtの例です



for (let i = 0; i < len; i++ | 0) {
  if(this.bigList[i]){ //遅い(約600ms)

----
let a = this.bigList;
for (let i = 0; i < len; i++ | 0) {
  if(a[i]){ //速い(約10ms)

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0