v0.85.0
から primary key に Int
がサポートされました。
おそらくこのコミットかなと思います。
Int
がサポートされて1年もたつんですね。はやいものです。
プライマリーキーの型による違いがあるのかと若干気になりながらも、特に調べる機会がありませんでした。
あまりそういう記事も見たりしないので、そんなに違いはないだろうなと...
とはいえ、どの程度違いがあるのか気になります。
そんなに目立った違いはないだろうとは思うんですけどね。
普通に考えれば空間効率で差がでそうですが、クライアントなんでそこまで気にはならないかなと思います。
ということで、今回はこの疑問を解決してみようと思った次第です。
Realm は core が公開されていないため、詳細は追えないのでベンチマークを計測して比較することにしました。
ベンチマーク
Realm v0.97.0 で試しました。
realm.io で使われているベンチマークを参考にして同じようなパターンで比較してみました。
以下、条件を各項目で計測してみました
- プライマリーキーが
int(連番)
,int(バラ)
,string
の3種類 - 計測端末を
iPhone 5s
,iPhone 6 Plus
,iPhone 6s
の3種類
insert
15 万レコードの追加にかかった時間
iPhone 5s | iPhone 6 Plus | iPhone 6s | |
---|---|---|---|
int(連番) | 1.1900 sec | 1.0466 sec | 0.5506 sec |
int | 0.9379 sec | 0.9126 sec | 0.4132 sec |
string | 0.9976 sec | 0.8932 sec | 0.4259 sec |
update
15 万レコードの更新にかかった時間
iPhone 5s | iPhone 6 Plus | iPhone 6s | |
---|---|---|---|
int(連番) | 0.4289 sec | 0.3419 sec | 0.1478 sec |
int | 0.3587 sec | 0.3058 sec | 0.1489 sec |
string | 0.4454 sec | 0.3534 sec | 0.1884 sec |
insert update
15 万レコードの追加/更新にかかった時間
iPhone 5s | iPhone 6 Plus | iPhone 6s | |
---|---|---|---|
int(連番) | 0.5644 sec | 0.4552 sec | 0.4041 sec |
int | 0.6205 sec | 0.4644 sec | 0.3957 sec |
string | 0.7167 sec | 0.5187 sec | 0.3875 sec |
filter
15 万レコードからの取得にかかった時間
iPhone 5s | iPhone 6 Plus | iPhone 6s | |
---|---|---|---|
primary key - int(連番) | 0.8374 sec | 0.6300 sec | 0.3588 sec |
primary key - int | 0.8162 sec | 0.5921 sec | 0.3247 sec |
primary key - string | 0.8479 sec | 0.6410 sec | 0.3876 sec |
int(連番) | 1.7811 sec | 1.2309 sec | 0.7563 sec |
int | 1.7453 sec | 1.2189 sec | 0.7307 sec |
string | 1.7452 sec | 1.2152 sec | 0.7237 sec |
enumerate
15 万レコードからの取得後に valueForKey
の実行にかかった時間
iPhone 5s | iPhone 6 Plus | iPhone 6s | |
---|---|---|---|
primary key - int(連番) | 2.1763 sec | 1.6664 sec | 1.0993 sec |
primary key - int | 2.5606 sec | 1.9454 sec | 1.3117 sec |
primary key - string | 15.0283 sec | 13.3181 sec | 9.9435 sec |
int(連番) | 9.0388 sec | 7.5988 sec | 6.3678 sec |
int | 9.0091 sec | 7.5670 sec | 5.9569 sec |
string | 9.0197 sec | 7.5639 sec | 5.9495 sec |
enumerate primery key - string
が圧倒的に遅いですね。
primary key で引かなければ問題がないので何かあるかもしれません。
なぜこうなるかは分かりませんが、 propery でアクセスするスコアは他と同じになるので、 valueForKey
を使った際にボトルネックになる処理があるのではないかなと推測されます。
まとめ
基本的には型に String
, Int
どちらを使おうが大抵のケースで誤差レベルです。
プライマリーキーが String
で valueForKey
を使わない限り、パフォーマンスに気になるほどの違いはなさそうでした。
とはいえ普段は propery でアクセスするケースが大半なので、パフォーマンスが出ないなって悩んだ時のために、頭の片隅にでも入れておけばいいんじゃないでしょうか。
実行速度以外にも CPU, Memory の利用率も出したかったですが時間が足りずに、ここまでとなります。
気になる方はベンチマークのプロジェクトを GitHub にあげておくので、個々で計測してもらえれば幸いです。
これで安心してプライマリーキーの型を決めれますね。
現場からは以上です。