Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Equivalence_in_JS
Search
chikoski
August 27, 2017
Technology
0
1.2k
Equivalence_in_JS
This slide introduces "equivalence" and Set type in JavaScript
chikoski
August 27, 2017
Tweet
Share
More Decks by chikoski
See All by chikoski
20210825_ossx
chikoski
0
200
festudy02-wasm
chikoski
1
900
An overview of WebAssembly; how it is used, created, and applied?
chikoski
1
620
Functions in JavaScript
chikoski
1
1k
20171018-WASM
chikoski
2
1.2k
20171002-wejs
chikoski
1
510
20170924-html5conference-wasm
chikoski
5
10k
いまさら振り返るPromise
chikoski
1
470
Design and Implementation of Tech Talks
chikoski
0
90
Other Decks in Technology
See All in Technology
日本におけるデータエンジニアリングのこれまでとこれから
foursue
16
4.2k
長期間TiDBを使ってきた話 @ 私たちはなぜNewSQLを使うのかTiDB選定5社が語る選定理由と活用LT / Experiences with TiDB Over Time
chibiegg
2
870
アクセシビリティを考慮したUI/CSSフレームワーク・ライブラリ選定
yajihum
2
1k
MySQL の SQL クエリチューニングの要所を掴む勉強会
andpad
2
6k
アクセス制御にまつわる改善 / Improving access control
itkq
0
510
NgRx Signal Store
rainerhahnekamp
0
140
Postman v10リリース後を振り返る
nagix
0
170
検証を通して見えてきたTiDBの性能特性
lycorptech_jp
PRO
6
3.7k
反実仮想機械学習とは何か
usaito
PRO
9
3.3k
開発生産性向上サービスを作るFindyが自分たちで開発生産性を爆上げした組織づくりの歩み / Findy's path to boosting its own development productivity 2024-04-17
ma3tk
3
610
Reducing Cross-Zone Egress at Spotify with Custom gRPC Load Balancing Recap
koh_naga
0
190
どうするコスト最適化のトレードオフ
tetsuyaooooo
1
490
Featured
See All Featured
VelocityConf: Rendering Performance Case Studies
addyosmani
320
23k
How to train your dragon (web standard)
notwaldorf
73
5.2k
The Invisible Customer
myddelton
114
12k
Why Our Code Smells
bkeepers
PRO
331
56k
Gamification - CAS2011
davidbonilla
76
4.6k
Six Lessons from altMBA
skipperchong
21
3k
A better future with KSS
kneath
231
16k
Docker and Python
trallard
34
2.7k
The Pragmatic Product Professional
lauravandoore
25
5.8k
The Cult of Friendly URLs
andyhume
74
5.7k
Building Effective Engineering Teams - LeadDev
addyosmani
28
1.8k
Mobile First: as difficult as doing things right
swwweet
216
8.6k
Transcript
同じ、とは N.Shimizu (
[email protected]
)
2と10は同じ
3と10は同じ
2と30029は同じ
Set: 重複を許さない値の集まり DPOTUMJTU<
> DPOTUTOFX4FU < > TTJ[FMJTUMFOHUIGBMTF MJTUKPJO "SSBZGSPN T KPJO TIBT USVF TIBT GBMTF
「同じ値」のオブジェクトなのに重複してしまう 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
Setにとって、「同じ」とは?
ECMAScriptに定義されている同値性比較* 利用しているJSの演算子 / 関数 Setが利用しているもの Abstract Equality Comparison Strict
Equality Comparison SameValue 0CKFUJT SameValueZero "SSBZQSPUPUZQFJODMVEF ϧ * SameValueNonNumber もありますが、処理系内部での利用に限られるので割愛します
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
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>
演算子のオーバロードができない
継承によってSetの振る舞いを変える DMBTT.Z4FUFYUFOET4FU\ BEE Y \ JG UZQFPGYFRVBMTGVODUJPO <UIJT>GJMUFS JYFRVBMT J
MFOHUI \ SFUVSOUIJT ^ SFUVSOTVQFSBEE Y ^ ^
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>
評価用のコード DPOTUOFYU*OUNBY7BMVF.BUIGMPPS NBY7BMVF .BUISBOEPN GVODUJPON TFU UJNFT \ MFUUPUBM
GPS MFUUUUJNFTU \ DPOTUTUBSU5JNF%BUFOPX DPOTUQOFX1PJOU OFYU*OU TFUTJ[F TFUBEE Q UPUBM %BUFOPX TUBSU5JNF ^ SFUVSOUPUBMUJNFT ^
適当な評価結果:激遅い* ͢Ͱʹೖ͍ͬͯΔཁૉ 4FU .Z4FU
* MacBook Pro 15inch 2016 / 2.7 GHz Intel Core i7 / 16 GB 2133 MHz LPDDR3 / N = 100
パフォーマンス測定結果 • MySet.prototype.addの半分はnextという処理に費やされている • Setから配列への変換に時間がかかっているものと思われる
「同じ値を持つもの」の検索に時間がかかってる? DMBTT.Z4FUFYUFOET4FU\ BEE Y \ JG UZQFPGYFRVBMTGVODUJPO <UIJT>GJMUFS JYFRVBMT J
MFOHUI \ SFUVSOUIJT ^ SFUVSOTVQFSBEE Y ^ ^
ハッシュ関数を用意する 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 ^ ^
速くなった!* ͢Ͱʹೖ͍ͬͯΔཁૉ 4FU .Z4FU )BTI4FU
* MacBook Pro 15inch 2016 / 2.7 GHz Intel Core i7 / 16 GB 2133 MHz LPDDR3 / N = 100
あの、属性値変わった場合は…
ユニークさが保てなくなる
解決策 • 変更を見張って、Set自体を作り直す • コスト高?変更の頻度が高いとうまくいかないのでは • 削除された要素を参照しているオブジェクトがいる場合は? • 集合の集合をつくる •
同じ値のグループをつくり、そのグループを管理 • 値が変更された、別のグループへ移す • コストは低い。メモリはよく使う。
同じ、は難しいのう