Slide 1

Slide 1 text

同じ、とは N.Shimizu ([email protected])

Slide 2

Slide 2 text

2と10は同じ

Slide 3

Slide 3 text

3と10は同じ

Slide 4

Slide 4 text

2と30029は同じ

Slide 5

Slide 5 text

Set: 重複を許さない値の集まり DPOTUMJTU< > DPOTUTOFX4FU < > TTJ[FMJTUMFOHUIGBMTF MJTUKPJO "SSBZGSPN T KPJO TIBT USVF TIBT GBMTF

Slide 6

Slide 6 text

「同じ値」のオブジェクトなのに重複してしまう DMBTT1PJOU\ DPOTUSVDUPS Y Z \UIJTY UIJTZ^ ^ DPOTUQ Y Z OFX1PJOU Y Z DPOTUMJTU DPOTUTOFX4FU MJTU TTJ[FMJTUMFOHUIUSVF TIBT Q GBMTF

Slide 7

Slide 7 text

Setにとって、「同じ」とは?

Slide 8

Slide 8 text

ECMAScriptに定義されている同値性比較* 利用しているJSの演算子 / 関数 Setが利用しているもの Abstract Equality Comparison Strict Equality Comparison SameValue 0CKFUJT SameValueZero "SSBZQSPUPUZQFJODMVEF ϧ * SameValueNonNumber もありますが、処理系内部での利用に限られるので割愛します

Slide 9

Slide 9 text

Y Z YZ YZ 0CKFDUJT Y Z 4BNF7BMVF;FSP Y Z VOEFGJOFE OVMM USVF GBMTF USVF GBMTF USVF USVF GBMTF USVF /B/ /B/ GBMTF GBMTF USVF USVF VOEFGJOFE GBMTF USVF GBMTF GBMTF GBMTF \Y Z^ \Y Z^ GBMTF GBMTF GBMTF GBMTF \Y Z^ Y USVF USVF USVF USVF

Slide 10

Slide 10 text

Set.prototype.addの振る舞い DPOTUTOFX4FU ╘Ә㗶൶Ӽਃᘻ TBEE /B/ 4FU TBEE /B/ 4FU TBEE VOEFGJOFE 4FU TBEE OVMM 4FU DPOTUY\Y Z^ TBEE Y 4FU TBEE Y 4FU TBEE \Y Z^ TBEE Y 4FU

Slide 11

Slide 11 text

演算子のオーバロードができない

Slide 12

Slide 12 text

継承によってSetの振る舞いを変える DMBTT.Z4FUFYUFOET4FU\ BEE Y \ JG UZQFPGYFRVBMTGVODUJPO <UIJT>GJMUFS JYFRVBMT J MFOHUI \ SFUVSOUIJT ^ SFUVSOTVQFSBEE Y ^ ^

Slide 13

Slide 13 text

DMBTT1PJOU\ DPOTUSVDUPS Y Z \UIJTY UIJTZ^ FRVBMT QPJOU \SFUVSOUIJTYQPJOUYUIJTZQPJOUZ^ ^ DPOTUQOFX1PJOU DPOTUQOFX1PJOU QQGBMTF QFRVBMT Q USVF DPOTUTOFX.Z4FU TBEE Q 4FU TBEE Q 4FU

Slide 14

Slide 14 text

評価用のコード DPOTUOFYU*OUNBY7BMVF.BUIGMPPS NBY7BMVF.BUISBOEPN GVODUJPON TFU UJNFT \ MFUUPUBM GPS MFUUUUJNFTU \ DPOTUTUBSU5JNF%BUFOPX DPOTUQOFX1PJOU OFYU*OU TFUTJ[F TFUBEE Q UPUBM%BUFOPX TUBSU5JNF ^ SFUVSOUPUBMUJNFT ^

Slide 15

Slide 15 text

適当な評価結果:激遅い* ͢Ͱʹೖ͍ͬͯΔཁૉ਺ 4FU .Z4FU * MacBook Pro 15inch 2016 / 2.7 GHz Intel Core i7 / 16 GB 2133 MHz LPDDR3 / N = 100

Slide 16

Slide 16 text

パフォーマンス測定結果 • MySet.prototype.addの半分はnextという処理に費やされている • Setから配列への変換に時間がかかっているものと思われる

Slide 17

Slide 17 text

「同じ値を持つもの」の検索に時間がかかってる? DMBTT.Z4FUFYUFOET4FU\ BEE Y \ JG UZQFPGYFRVBMTGVODUJPO <UIJT>GJMUFS JYFRVBMT J MFOHUI \ SFUVSOUIJT ^ SFUVSOTVQFSBEE Y ^ ^

Slide 18

Slide 18 text

ハッシュ関数を用意する DMBTT)BTI4FUFYUFOET4FU\ DPOTUSVDUPS JUFSBCMF \ TVQFS UIJTIBTI7BMVFTOFX4FU GPS DPOTUJPGJUFSBCMF \ UIJTBEE J ^ ^ BEE WBMVF \ JG UZQFPGWBMVFIBTIGVODUJPO \ DPOTUIBTIWBMVFIBTI JG UIJTIBTI7BMVFTIBT IBTI \ SFUVSOUIJT ^ UIJTIBTI7BMVFTBEE IBTI ^ TVQFSBEE WBMVF SFUVSOUIJT ^ ^ DMBTT1PJOU\ DPOTUSVDUPS Y Z \ UIJTYY UIJTZZ ^ IBTI \ SFUVSOA\UIJTY^ \UIJTZ^A ^ FRVBMT Q \ SFUVSOUIJTYQYUIJTZQZ ^ ^

Slide 19

Slide 19 text

速くなった!* ͢Ͱʹೖ͍ͬͯΔཁૉ਺ 4FU .Z4FU )BTI4FU * MacBook Pro 15inch 2016 / 2.7 GHz Intel Core i7 / 16 GB 2133 MHz LPDDR3 / N = 100

Slide 20

Slide 20 text

あの、属性値変わった場合は…

Slide 21

Slide 21 text

ユニークさが保てなくなる

Slide 22

Slide 22 text

解決策 • 変更を見張って、Set自体を作り直す • コスト高?変更の頻度が高いとうまくいかないのでは • 削除された要素を参照しているオブジェクトがいる場合は? • 集合の集合をつくる • 同じ値のグループをつくり、そのグループを管理 • 値が変更された、別のグループへ移す • コストは低い。メモリはよく使う。

Slide 23

Slide 23 text

同じ、は難しいのう