Equivalence_in_JS

00580f6c11851d2fff0b3e2f7392226b?s=47 N. Shimizu
August 27, 2017

 Equivalence_in_JS

This slide introduces "equivalence" and Set type in JavaScript

00580f6c11851d2fff0b3e2f7392226b?s=128

N. Shimizu

August 27, 2017
Tweet

Transcript

  1. 同じ、とは N.Shimizu (chikoski@gmail.com)

  2. 2と10は同じ

  3. 3と10は同じ

  4. 2と30029は同じ

  5. Set: 重複を許さない値の集まり DPOTUMJTU<       

     > DPOTUTOFX4FU <         >  TTJ[FMJTUMFOHUIGBMTF MJTUKPJO             "SSBZGSPN T KPJO       TIBT  USVF TIBT  GBMTF
  6. 「同じ値」のオブジェクトなのに重複してしまう DMBTT1PJOU\ DPOTUSVDUPS Y Z \UIJTY UIJTZ^ ^ DPOTUQ Y

    Z OFX1PJOU Y Z  DPOTUMJTU<Q   Q   Q   Q   Q   Q   > DPOTUTOFX4FU MJTU  TTJ[FMJTUMFOHUIUSVF TIBT Q   GBMTF
  7. Setにとって、「同じ」とは?

  8. ECMAScriptに定義されている同値性比較* 利用しているJSの演算子 / 関数 Setが利用しているもの Abstract Equality Comparison  Strict

    Equality Comparison  SameValue 0CKFUJT SameValueZero "SSBZQSPUPUZQFJODMVEF ϧ * SameValueNonNumber もありますが、処理系内部での利用に限られるので割愛します
  9. 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
  10. Set.prototype.addの振る舞い DPOTUTOFX4FU ╘Ә㗶൶Ӽਃᘻ TBEE /B/ 4FU </B/>  TBEE /B/

    4FU </B/>  TBEE VOEFGJOFE 4FU </B/ VOEFGJOFE>  TBEE OVMM 4FU </B/ VOEFGJOFE OVMM>  DPOTUY\Y Z^ TBEE Y 4FU </B/ VOEFGJOFE OVMM PCKFDU>  TBEE Y 4FU </B/ VOEFGJOFE OVMM PCKFDU>  TBEE \Y Z^  TBEE Y 4FU </B/ VOEFGJOFE OVMM PCKFDU PCKFDU> 
  11. 演算子のオーバロードができない

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

    MFOHUI \ SFUVSOUIJT ^ SFUVSOTVQFSBEE Y  ^ ^
  13. DMBTT1PJOU\ DPOTUSVDUPS Y Z \UIJTY UIJTZ^ FRVBMT QPJOU \SFUVSOUIJTYQPJOUYUIJTZQPJOUZ^ ^

    DPOTUQOFX1PJOU    DPOTUQOFX1PJOU    QQGBMTF QFRVBMT Q USVF DPOTUTOFX.Z4FU  TBEE Q 4FU <PCKFDU>  TBEE Q 4FU <PCKFDU> 
  14. 評価用のコード DPOTUOFYU*OUNBY7BMVF.BUIGMPPS NBY7BMVF .BUISBOEPN  GVODUJPON TFU UJNFT \ MFUUPUBM

    GPS MFUUUUJNFTU \ DPOTUTUBSU5JNF%BUFOPX  DPOTUQOFX1PJOU OFYU*OU TFUTJ[F   TFUBEE Q  UPUBM %BUFOPX TUBSU5JNF ^ SFUVSOUPUBMUJNFT ^
  15. 適当な評価結果:激遅い* ͢Ͱʹೖ͍ͬͯΔཁૉ਺ 4FU .Z4FU      

             * MacBook Pro 15inch 2016 / 2.7 GHz Intel Core i7 / 16 GB 2133 MHz LPDDR3 / N = 100
  16. パフォーマンス測定結果 • MySet.prototype.addの半分はnextという処理に費やされている • Setから配列への変換に時間がかかっているものと思われる

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

    MFOHUI \ SFUVSOUIJT ^ SFUVSOTVQFSBEE Y  ^ ^
  18. ハッシュ関数を用意する 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 ^ ^
  19. 速くなった!* ͢Ͱʹೖ͍ͬͯΔཁૉ਺ 4FU .Z4FU )BTI4FU     

                   * MacBook Pro 15inch 2016 / 2.7 GHz Intel Core i7 / 16 GB 2133 MHz LPDDR3 / N = 100
  20. あの、属性値変わった場合は…

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

                  
  22. 解決策 • 変更を見張って、Set自体を作り直す • コスト高?変更の頻度が高いとうまくいかないのでは • 削除された要素を参照しているオブジェクトがいる場合は? • 集合の集合をつくる •

    同じ値のグループをつくり、そのグループを管理 • 値が変更された、別のグループへ移す • コストは低い。メモリはよく使う。
  23. 同じ、は難しいのう