Realm でプライマリーキーの型による違いを計測してみた

  • 6
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

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 どちらを使おうが大抵のケースで誤差レベルです。
プライマリーキーが StringvalueForKey を使わない限り、パフォーマンスに気になるほどの違いはなさそうでした。
とはいえ普段は propery でアクセスするケースが大半なので、パフォーマンスが出ないなって悩んだ時のために、頭の片隅にでも入れておけばいいんじゃないでしょうか。

実行速度以外にも CPU, Memory の利用率も出したかったですが時間が足りずに、ここまでとなります。
気になる方はベンチマークのプロジェクトを GitHub にあげておくので、個々で計測してもらえれば幸いです。

これで安心してプライマリーキーの型を決めれますね。

現場からは以上です。