Slide 1

Slide 1 text

Scala NativeでAtCoderに
 入門してみた
 佐藤貴比呂


Slide 2

Slide 2 text

自己紹介
 名前: 佐藤 貴比呂
 会社: SIer => SIer => 株式会社kubell 趣味: 
 - 釣り
 - 運動(サッカー→ホッケー→柔道→チアリーディング)
 SNS: - Twitter(Satoooooooooooo) - Github(tsatow)


Slide 3

Slide 3 text

なんでAtCoderに入門?
 - 最近コード書いてない
 - ここ1年弱の主な仕事→ミドルウェアのリプレイス等→検証タスク多め 
 - プライベートが忙しい(言い訳)
 - 最近はイカ釣りにどハマりしてる 
 - 2-7月は毎週マルイカを追ってた 
 - 直近はヤリイカ・スルメイカ 
 - もうすぐアオリイカ開幕ですね^^ 
 - エンジニアならプライベートもコードを書くものなのでは? 
 - すみません、釣りが本業なので... 
 
 →隙間時間にコツコツやれる競プロが良さそう


Slide 4

Slide 4 text

なんでScala Native?
 - 勉強を兼ねてRustでやる?
 - 隙間時間にサクッとできなさそう 
 - 知ってる言語でやりたい 
 
 - なんかJVM言語は起動時間が含まれるので不利らしい...(知らんけど)
 
 うーん...🤔
 


Slide 5

Slide 5 text

Scala Native使えるじゃん!


Slide 6

Slide 6 text

とりあえず何から始める?
 いきなりコンテストには参加したくない。オレは慎重な男...
 
 
 - とりあえず過去問精選10問でも解いてみるか...
 - AtCoderの過去問の中からけんちょんさんが精選したもの 
 - 難易度は(ただAC通すだけなら)易しめで入門にオススメっぽい 
 - 自分にはちょうど良さそう 
 ???「何十年も修行して達人にでもなるのを待ってから戦場に出...」
 ぼく「うるせえ!!!!」


Slide 7

Slide 7 text

で、実際使ってみての感想
 - めっちゃ速い
 - 省メモリ
 - が、結構ハマった
 - Javaのライブラリでサポートされてないものがある(java.util.Scannerとか) 
 - 実行してみないとわからない 
 - テストの実行時でトラブル 
 - ScalaTest、munitで上手く動かなかった 
 - とりあえず公式ドキュメントで言及されてるJUnitを使うのが無難かも? 
 - エラーが発生した時にUnknown Sourceだらけで辛い 
 - (単に準備不足すぎるだけかも...) 
 Exception in thread "main"java.lang.NumberFormatException: For input string: "" at java.lang.Integer$.fail(Unknown Source) at java.lang.Integer$.parseInt(Unknown Source) at java.lang.Integer$.parseInt(Unknown Source) at java.lang.Integer.parseInt(Unknown Source) at scala.collection.StringOps$.toInt$extension(Unknown Source) at Main$.$anonfun$2$$anonfun$1(Unknown Source) at Main$$$Lambda$4.apply(Unknown Source) at scala.collection.ArrayOps$.map$extension(Unknown Source) at Main$.$anonfun$2(Unknown Source) at Main$$$Lambda$2.apply$mcII$sp(Unknown Source) at scala.runtime.java8.JFunction1$mcII$sp.apply(Unknown Source) at scala.collection.StrictOptimizedIterableOps.strictOptimizedMap(Unknown Source) at scala.collection.immutable.Range.strictOptimizedMap(Unknown Source) at scala.collection.StrictOptimizedIterableOps.map(Unknown Source) at scala.collection.immutable.Range.map(Unknown Source) at Main$.main(Unknown Source) at Main.main(Unknown Source) at .main(Unknown Source)

Slide 8

Slide 8 text

JVM版と比較すると?
 
 
 実行環境
 実行時間(ミリ秒)
 メモリ(KB)
 提出から結果出るまで(秒) 
 第1問
 ABC086 A
 Scala Native
 3
 4688
 58
 Scala(JVM)
 226
 51776
 17
 第2問
 ABC081 A
 Scala Native
 2
 4668
 58
 Scala(JVM)
 203
 51268
 19
 第3問
 ABC081 B
 Scala Native
 3
 5896
 48
 Scala(JVM)
 248
 52584
 21
 第4問
 ABC087 B
 Scala Native
 9
 9424
 58
 Scala(JVM)
 287
 56572
 17
 第5問
 ABC083 B
 Scala Native
 9
 9424
 58
 Scala(JVM)
 287
 56572
 17
 ※かなり雑に解いてます

Slide 9

Slide 9 text

JVM版と比較すると?
 
 
 実行環境
 実行時間(ミリ秒)
 メモリ(KB)
 提出から結果出るまで(秒) 
 第6問
 ABC088 B
 Scala Native
 1
 4940
 68
 Scala(JVM)
 232
 52000
 21
 第7問
 ABC085 B
 Scala Native
 1
 4016
 48
 Scala(JVM)
 211
 52076
 20
 第8問
 ABC085 C
 Scala Native
 65
 16076
 63
 Scala(JVM)
 354
 63608
 26
 第9問
 ABC049 C
 Scala Native
 5
 8584
 46
 Scala(JVM)
 354
 62996
 22
 第10問
 ABC086 C
 Scala Native
 583
 284700
 59
 Scala(JVM)
 571
 78892
 23
 ※かなり雑に解いてます

Slide 10

Slide 10 text

JVM版と比較すると?
 - 実行速度はScala Nativeが有利
 - メモリもScala Nativeの方がかなり少ない
 - ただしScala NativeだけMLEとなるケースも(なんでや)
 - ACまでの時間は圧倒的にJVM版の方が短い


Slide 11

Slide 11 text

最後に
 - AtCoderに入門するのが目的ならまずはJVM版のScalaで良さそう
 - Scala Nativeについては雑に使い始めてしまったので、ちゃんとドキュメント読んだら また違う印象になるかも
 - この発表でScala Nativeにネガティブな印象を持たれるのは本意ではない
 - 不安定に感じたのは単に習熟度の低さの可能性が大きい


Slide 12

Slide 12 text

ご清聴ありがとうございました