Laravel Collectionの各メソッドの計算量を確認してみた。
Laravel CollectionͷܭࢉྔΛௐͯΈͨ1)1ษڧձ*OOPWBUPS+BQBO*ODॴ྄&OHJOFFS
View Slide
ܭࢉྔʹ͍͓ͭͯ͞Β͍ຊ࣌ؒతܭࢉྔΛѻ͍·͢
ྫ͑ϨϏϡʔ͍ͯ͠Δ࣌
ʮ͜ͷॲཧͦ͏ʯ͜Εͩͱ͔Γʹ͍͘ɻॲཧͷ࣌ؒతΛڞ௨ࣝͰ͍͑ͨ
ӳޠͩͱ Time Complexity࣌ؒෳࡶੑϓϩάϥϜͷॲཧʹͲΕ͘Β͍͕͔͔࣌ؒΔ͔Λֶతʹѻ͏
Oه๏O(1)O(log n)O(n)O(n * log n)O(n^2)ϓϩάϥϜͷ࣌ؒతܭࢉྔΛද͢
Oه๏σʔλྔ͕૿Ճͨ͠߹ͷॲཧ࣌ؒͷ૿Ճ͕͔Δ
[άϥϑҾ༻] ։ൃ৽ଔʹ๋͙ɺجຊͷΞϧΰϦζϜͱܭࢉྔhttp://www.techscore.com/blog/2016/08/08/։ൃ৽ଔʹ๋͙ɺجຊͷΞϧΰϦζϜͱܭࢉྔ/σʔλྔͱܭࢉྔ
ܭࢉྔͱΞϧΰϦζϜΞϧΰϦζϜ ܭࢉྔόϒϧιʔτ 0 O?Ϛʔδιʔτ 0 OMPHOόΠφϦαʔν 0 MPHOΞϧΰϦζϜʹΑͬͯܭࢉྔ͕ҟͳΔ
͞Βʹৄ͘͠Γ͍ͨਓֶΨʔϧ4 ཚΞϧΰϦζϜ2ষͱ6ষΛಡΉ͠
ຊʹΔ
Laravel Collection֤ϝιουͷܭࢉྔ͏ͪΐͬͱ͖Ε͍ʹ͠·͢…
ࡶʹ·ͱΊΔͱ• ΄ͱΜͲ O(n)• O(1) ͕9ݸ• O(n^2) Ҏ্͕8ݸ
ཁҙϝιου• collapse O(n^2)• crossJoin O(n^3)• diff O(n^t)• diffAssoc O(n^t)• flatMap O(n^2)• flatten O(n^2)• groupBy O(n^2)• intersect O(n^2)
࣮ଌͯ͠Έͨ
where - O(n) ॲཧ࣌ؒ(ඵ)σʔλ݅
count - O(1) ॲཧ࣌ؒ(ඵ)σʔλ݅
collapse - O(n^2) ॲཧ࣌ؒ(ඵ)σʔλ݅
crossJoin - O(n^3) ॲཧ࣌ؒ(ඵ)σʔλ݅
diff - O(n^t) ॲཧ࣌ؒ(ඵ)σʔλ݅tfieldʹґଘ͢Δ
ܭࢉྔ͕͔ͬͨͱͯ͠Կ͔ྑ͍͜ͱ͋Δͷ͔ʁ
Βͳ͍ͱѱ͍͜ͱ͕ى͖Δ
࣮ࡍʹ͔͋ͬͨ͠Εͳ͍ܭࢉྔ͕ʹͳͬͨίʔυྫ※࣮Λݩʹͨ͠ϑΟΫγϣϯͰ͢
શ݅औಘϖʔδϯάͷͨΊʹશ݅ϧʔϓͰճ͢ྫ1
શ݅औಘϖʔδϯάͷͨΊʹશ݅ϧʔϓͰճ͢ϖʔδͷޙʹߦ͚ߦ͘΄Ͳϧʔϓ͕ճͬͯ͘ͳΔ O(n)ྫ1
߹Θٕͤ O(n^2)O(n)ΛೖΕࢠʹ͢ΕύϫʔΞοϓྫ2ୈ1ϧʔϓͰશ݅ճ͢ O(n)ୈ2ϧʔϓશ݅ճ͢ O(n)
ୈҰҾ࠷େͰඦ݅ఔ͕ͩͬͨୈೋҾͷσʔλ͕͍ͯͬͯ͠…ྫ2ୈ1ϧʔϓͰશ݅ճ͢ O(n)ୈ2ϧʔϓશ݅ճ͢ O(n)
ྫ2ͷΞϧΰϦζϜΛ࡞࣮ͬͯଌͯ͠ΈΔ
σʔλྔʹΑΔੑೳͷྼԽ ॲཧ࣌ؒ(ඵ)σʔλ݅ (ୈ1,2 Ҿಉ͡)
ͪΌΜͱO(n^2)ͷάϥϑʹͳͬͨ
ࣄલʹݕͰ͖ͳ͍͔ʁ
࣮ྫ̍ɾ̎ͷίʔυ୯ମςετ -> ௨աड͚ೖΕςετ -> ௨ա௨աͯ͠͠·͍ͬͯͨ…
ෛՙςετίʔυϨϏϡʔࣄલݕग़Մೳͳࡆ
ෛՙςετσʔλྔ͕ലେʹͳΔ͜ͱ͕Θ͔͍ͬͯΔϓϩμΫτߦ͍ͬͯΔɻ௨ৗͷϓϩμΫτͩͱ͋Μ·ΓͬͯΔͷݟͨ͜ͱແ͍ɻ
ίʔυϨϏϡʔϨϏϡΞʔͷεΩϧܦݧʹґଘࣄલʹܭࢉྔʹ͍ͭͯνʔϜͰษڧձͱ͔ͯ͠Εࢦఠˍमਖ਼؆୯ͩͱࢥ͏
ࢹπʔϧͰɺॲཧ࣌ؒͷϝτϦΫεΛݟͯཧ٧ΊͰॲཧ࣌ؒͷ͍෦ΛಛఆͰ͖Ε·͋ɺٴୈͩͱࢥ͏ɻ࠷ѱݟಀͯ͠
͓·͚
ܭࢉྔ͕Ұྎવ
σʔλͷू·ΓΛѻ͏ϓϩάϥϜܭࢉྔ͕໌ࣔ͞Ε͍ͯΔͱ͋Γ͕͍ͨ
͓͠·͍