ScalaのSymbolについて

0
ぽんこつ @ponkotuy

ScalaのSymbolリテラル非推奨なのか。Symbol("abc")だと一旦文字列生成するからコスト増になるけど、コレが推奨されるの?

2019-08-06 14:56:58
がくぞ @gakuzzzz

@ponkotuy Symbol("abc") はあくまで移行のための手段であって、推奨としてはStringを直接使う方向じゃないですかね?

2019-08-06 15:00:33
ぽんこつ @ponkotuy

@gakuzzzz んーなる、Skinny-ORMが存外どっぷりSymbolに依存してるんでどうしたもんかな、みたいな話してた

2019-08-06 15:01:33
Kenji Yoshida @xuwei_k

@ponkotuy @gakuzzzz skinny-orm全部Stringに変えるpull reqしましょう(ぇ

2019-08-06 15:41:03
ぽんこつ @ponkotuy

@xuwei_k @gakuzzzz 既存のコードと互換性考えると頭痛くしかならない…

2019-08-06 15:41:53
Kenji Yoshida @xuwei_k

ちなみに twitter.com/ponkotuy/statu… "一旦文字列生成するからコスト増" が、実行時のコストのことなら、べつにおなじbytecodeになるだけだから、変わらないはず。 (Symbol生成は特殊な最適化がされてるのだが github.com/scala/scala/bl… リテラルでもそうでなくても、この最適化は勝手に適用されるっぽい)

2019-08-06 16:17:57
ぽんこつ @ponkotuy

む、そうなのか、勘違いしてた

2019-08-06 16:18:47
ぽんこつ @ponkotuy

なんかSymbolのオブジェクトとStringのオブジェクト2つ生成するのは割と馬鹿にならんのではとおもった(symbolリテラルが2つ作らないというのが誤解かな

2019-08-06 16:19:31
Kenji Yoshida @xuwei_k

@ponkotuy 詳細に説明できるほど知識ないですが、生成方法を最適化しているだけでSymbol自体はこういう定義だから github.com/scala/scala/bl… キャッシュなければある意味 "SymbolのオブジェクトとStringのオブジェクト2つ生成する" というの自体は間違ってないので、そういう意味ではSymbol自体が微妙というか

2019-08-06 16:23:40
kmizu @kmizu

@gakuzzzz @xuwei_k @ponkotuy ちょっと微妙な話がありまして、scaladocにもある通り、Symbol classのオブジェクトはreference equalityでもって比較できる(=極めて小さい定数時間で処理が完了することが保証されている)ので、用途特化では便利だったりします。ただ、それが便利な用途ってそれこそ言語処理系とか限定かも。

2019-08-06 17:06:59
kmizu @kmizu

Symbolのequalsが github.com/scala/scala/bl… であることの意義が実はあまり共有されていない(?)、ということに今気づいたのでした。ただまあ、そのライブラリの意義はあるとしても、リテラル表記はまあ要らないなという話になりそですが。

2019-08-06 17:09:18
Kenji Yoshida @xuwei_k

@kmizu @gakuzzzz @ponkotuy はい。でもStringも作られ方によっては "reference equalityで比較される" ことも多いので "必ずreference equalityで比較できる" ことを保証するために github.com/scala/scala/bl… WeakReferenceなど使って生成する部分のパフォーマンスとのトレードオフになって、それはどうなんだ、という問題が…

2019-08-06 17:11:43
がくぞ @gakuzzzz

@kmizu @xuwei_k @ponkotuy あ、なるほど。reference equality が保証されてるのであればScalaでもSymbolインスタンスの共有は内部的に行ってるんですね

2019-08-06 17:12:32
kmizu @kmizu

@xuwei_k @gakuzzzz @ponkotuy 個人的な見解なんですが、実際にSymbolの比較を高速にしたいシチュエーション考えると、こうやってガチガチに保証するのはオーバーキルでは、と思います(安心して使うためには、というのもわかるんですけど、保証範囲を明確に限定してしまえばいい、とか思います)。

2019-08-06 17:18:49
Kenji Yoshida @xuwei_k

Symbolの特殊な最適化といえば、それのせいでsbt-assemblyでshardingするとSymbolがうまく動かない、というissueが報告されていて、なるほどな、と思った twitter.com/xuwei_k/status… github.com/sbt/sbt-assemb…

2019-08-06 17:47:11