Skip to content

Comparing the performance characteristics of Realm, SwiftData and CoreData

Notifications You must be signed in to change notification settings

Data-swift/RealmVsSwiftData

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

16 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Perf Test for CoreData, SwiftData and Realm

Comparing the performance characteristics of Realm, SwiftData and CoreData.

Code accompanying the Emerge Tools blog article: SwiftData vs Realm: Performance Comparison by Jacob Bartlett.

Original repositoy: https://github.com/jacobsapps/RealmVsSwiftData

Michal Tsai's coverage: https://mjtsai.com/blog/2024/06/24/swiftdata-vs-realm-performance-comparison/

Issues

  • UUID init is superfluous in all but Realm? CD/SQLite can do the primary keys.
  • Delete all users could be just a database table drop/recreate?

Links

Numbers (Simulator)

M2 Mac Mini Pro, Xcode 16 b2, running in simulator Note: Core Data in the simulator seems to be about 40β¨― slower than on device!

  • SwiftData and CoreData can grow big, e.g. SwiftData >6GB of RAM for the 1m user inserts, or CoreData >2GB of RAM for the "complex" 100k run.
  • SwiftData w/ 1m re-running w/ the fixed non-upsert implementation

Summary simple create, in seconds:

Count SwiftData CoreData Realm Lighter
100 0.02 0.01 0.003 -
1,000 0.10 0.02 0.03 -
10,000 2.02 0.62 0.07 -
100,000 165.10 58.87 0.52 7.85
1,000,000 (10333.91) 4749.45 5.05 -
2,000,000 - - 9.74 -

Summary complex create, in seconds:

  • the Core Data numbers look odd compared to SwiftData, maybe doing sth wrong here
Count SwiftData CoreData Realm
100 0.11 8.04 0.01
1,000 1.14 81.11 0.06
10,000 46.49 826.98 0.39
100,000 3835.28 8918.96 3.66
200,000 18408.65 19687.10 7.10
1,000,000 - - 37.35

Simple User Objects

πŸ’½ ===============
πŸ’½ SwiftData: 100 Simple Objects
===============
πŸ’½ User instantiation: 0.0031
πŸ’½ Create users: 0.0166
0 users named Jane
πŸ’½ Fetch users named `Jane` in age order: 0.0021
0 users renamed to `Wendy`
πŸ’½ Rename users named `Jane` to `Wendy`: 0.0002
πŸ’½ DB file size: 0.07 MB
πŸ’½ Delete all users: 0.0009

πŸ’½ ===============
πŸ’½ SwiftData: 1.000 Simple Objects
===============
πŸ’½ User instantiation: 0.0059
πŸ’½ Create users: 0.0989
0 users named Jane
πŸ’½ Fetch users named `Jane` in age order: 0.0005
0 users renamed to `Wendy`
πŸ’½ Rename users named `Jane` to `Wendy`: 0.0004
πŸ’½ DB file size: 0.08 MB
πŸ’½ Delete all users: 0.0029

πŸ’½ ===============
πŸ’½ SwiftData: 10.000 Simple Objects
===============
πŸ’½ User instantiation: 0.0577
πŸ’½ Create users: 2.0238
4 users named Jane
πŸ’½ Fetch users named `Jane` in age order: 0.0029
4 users renamed to `Wendy`
πŸ’½ Rename users named `Jane` to `Wendy`: 0.0080
πŸ’½ DB file size: 0.18 MB
πŸ’½ Delete all users: 0.0217

πŸ’½ ===============
πŸ’½ SwiftData: 100.000 Simple Objects
===============
πŸ’½ User instantiation: 0.5708
πŸ’½ Create users: 165.1004 (2:45min)
26 users named Jane
πŸ’½ Fetch users named `Jane` in age order: 0.0480
26 users renamed to `Wendy`
πŸ’½ Rename users named `Jane` to `Wendy`: 0.1953
πŸ’½ DB file size: 11.01 MB
πŸ’½ Delete all users: 0.2946

πŸ’½ ===============
πŸ’½ SwiftData: 1.000.000 Simple Objects
===============
πŸ’½ User instantiation: 5.5942
πŸ’½ Create users: 10333.9109 (~2:52h)
237 users named Jane
πŸ’½ Fetch users named `Jane` in age order: 1.9051
237 users renamed to `Wendy`
πŸ’½ Rename users named `Jane` to `Wendy`: 170.9562
πŸ’½ DB file size: 110.82 MB
πŸ’½ Delete all users: 16.4258

πŸ’½ ===============
πŸ’½ CoreData: 100 Simple Objects
===============
πŸ’½ User instantiation: 0.0010
πŸ’½ Create users: 0.0057
0 users named `Jane`
πŸ’½ Fetch users named `Jane` in age order: 0.0006
0 users named `Jane` being renamed to `Wendy`
0 users renamed to `Wendy`
πŸ’½ Rename users named `Jane` to `Wendy`: 0.0002
πŸ’½ DB file size: 0.03 MB
πŸ’½ Delete all users: 0.0002

πŸ’½ ===============
πŸ’½ CoreData: 1.000 Simple Objects
===============
πŸ’½ User instantiation: 0.0021
πŸ’½ Create users: 0.0178
0 users named `Jane`
πŸ’½ Fetch users named `Jane` in age order: 0.0002
0 users named `Jane` being renamed to `Wendy`
0 users renamed to `Wendy`
πŸ’½ Rename users named `Jane` to `Wendy`: 0.0003
πŸ’½ DB file size: 0.03 MB
πŸ’½ Delete all users: 0.0008

πŸ’½ ===============
πŸ’½ CoreData: 10.000 Simple Objects
===============
πŸ’½ User instantiation: 0.0206
πŸ’½ Create users: 0.6172
0 users named `Jane`
πŸ’½ Fetch users named `Jane` in age order: 0.0012
0 users named `Jane` being renamed to `Wendy`
0 users renamed to `Wendy`
πŸ’½ Rename users named `Jane` to `Wendy`: 0.0013
πŸ’½ DB file size: 0.03 MB
πŸ’½ Delete all users: 0.0076

πŸ’½ ===============
πŸ’½ CoreData: 100.000 Simple Objects
===============
πŸ’½ User instantiation: 0.1903
πŸ’½ Create users: 58.8672 (1min)
29 users named `Jane`
πŸ’½ Fetch users named `Jane` in age order: 0.0278
29 users named `Jane` being renamed to `Wendy`
29 users renamed to `Wendy`
πŸ’½ Rename users named `Jane` to `Wendy`: 0.0537
πŸ’½ DB file size: 7.28 MB
πŸ’½ Delete all users: 0.0971

πŸ’½ ===============
πŸ’½ CoreData: 1.000.000 Simple Objects
===============
πŸ’½ User instantiation: 1.9665
πŸ’½ Create users: 4749.4489 (~1:20h)
202 users named `Jane`
πŸ’½ Fetch users named `Jane` in age order: 0.7345
202 users named `Jane` being renamed to `Wendy`
202 users renamed to `Wendy`
πŸ’½ Rename users named `Jane` to `Wendy`: 1.4318
πŸ’½ DB file size: 72.67 MB
πŸ’½ Delete all users: 64.1758

πŸ’½ ===============
πŸ’½ Realm: 100 Simple Objects
===============
πŸ’½ User instantiation: 0.0005
πŸ’½ Create users: 0.0038
0 users named Jane
πŸ’½ Fetch users named `Jane` in age order: 0.0037
0 users renamed to `Wendy`
πŸ’½ Rename users named `Jane` to `Wendy`: 0.0022
πŸ’½ DB file size: 0.02 MB
πŸ’½ Delete all users: 0.0012

πŸ’½ ===============
πŸ’½ Realm: 1.000 Simple Objects
===============
πŸ’½ User instantiation: 0.0021
πŸ’½ Create users: 0.0260
0 users named Jane
πŸ’½ Fetch users named `Jane` in age order: 0.0001
0 users renamed to `Wendy`
πŸ’½ Rename users named `Jane` to `Wendy`: 0.0021
πŸ’½ DB file size: 0.12 MB
πŸ’½ Delete all users: 0.0024

πŸ’½ ===============
πŸ’½ Realm: 10.000 Simple Objects
===============
πŸ’½ User instantiation: 0.0190
πŸ’½ Create users: 0.0680
2 users named Jane
πŸ’½ Fetch users named `Jane` in age order: 0.0003
2 users renamed to `Wendy`
πŸ’½ Rename users named `Jane` to `Wendy`: 0.0017
πŸ’½ DB file size: 1.00 MB
πŸ’½ Delete all users: 0.0028

πŸ’½ ===============
πŸ’½ Realm: 100.000 Simple Objects
===============
πŸ’½ User instantiation: 0.1950
πŸ’½ Create users: 0.5171
23 users named Jane
πŸ’½ Fetch users named `Jane` in age order: 0.0010
23 users renamed to `Wendy`
πŸ’½ Rename users named `Jane` to `Wendy`: 0.0053
πŸ’½ DB file size: 6.00 MB
πŸ’½ Delete all users: 0.0094

πŸ’½ ===============
πŸ’½ Realm: 1.000.000 Simple Objects
===============
πŸ’½ User instantiation: 1.6582
πŸ’½ Create users: 5.0533
204 users named Jane
πŸ’½ Fetch users named `Jane` in age order: 0.0134
204 users renamed to `Wendy`
πŸ’½ Rename users named `Jane` to `Wendy`: 0.0129
πŸ’½ DB file size: 55.33 MB
πŸ’½ Delete all users: 0.0287

πŸ’½ ===============
πŸ’½ Realm: 2.000.000 Simple Objects
===============
πŸ’½ User instantiation: 3.2950
πŸ’½ Create users: 9.7441
410 users named Jane
πŸ’½ Fetch users named `Jane` in age order: 0.0206
410 users renamed to `Wendy`
πŸ’½ Rename users named `Jane` to `Wendy`: 0.0319
πŸ’½ DB file size: 112.11 MB
πŸ’½ Delete all users: 0.0446

πŸ’½ ===============
πŸ’½ Lighter: 1.000.000 Simple Objects
===============
πŸ’½ User instantiation: 0.4484
πŸ’½ Create users: 7.8463
πŸ’½ Create index: 0.3628
218 users named Jane
πŸ’½ Fetch users named `Jane` in age order: 0.0016
218 users renamed to `Wendy`
πŸ’½ Rename users named `Jane` to `Wendy`: 0.0100
πŸ’½ DB file size: 79.65 MB
πŸ’½ Delete all users: 10.0460

Complex Student/School/Grade Objects

πŸ’½ ===============
πŸ’½ SwiftData: 100 Complex Objects
===============
πŸ’½ Student instantiation: 0.0058
πŸ’½ Create students: 0.1101
3 students with an A* in Physics
πŸ’½ Read students with A* in Physics: 0.0021
πŸ’½ Fail the cheating Maths students: 0.0005
πŸ’½ DB file size: 0.73 MB
πŸ’½ Delete all students: 0.0034

πŸ’½ ===============
πŸ’½ SwiftData: 1.000 Complex Objects
===============
πŸ’½ Student instantiation: 0.0367
πŸ’½ Create students: 1.1428
43 students with an A* in Physics
πŸ’½ Read students with A* in Physics: 0.0185
πŸ’½ Fail the cheating Maths students: 0.0170
πŸ’½ DB file size: 1.13 MB
πŸ’½ Delete all students: 0.0194

πŸ’½ ===============
πŸ’½ SwiftData: 10.000 Complex Objects
===============
πŸ’½ Student instantiation: 0.3201
πŸ’½ Create students: 46.4866
390 students with an A* in Physics
πŸ’½ Read students with A* in Physics: 1.4684
πŸ’½ Fail the cheating Maths students: 0.7190
πŸ’½ DB file size: 7.83 MB
πŸ’½ Delete all students: 0.2226

πŸ’½ ===============
πŸ’½ SwiftData: 100.000 Complex Objects
===============
πŸ’½ Student instantiation: 3.2821
πŸ’½ Create students: 3835.2785 (>1h)
3951 students with an A* in Physics
πŸ’½ Read students with A* in Physics: 107.9419
πŸ’½ Fail the cheating Maths students: 76.1356
πŸ’½ DB file size: 71.50 MB
πŸ’½ Delete all students: 11.1390

πŸ’½ ===============
πŸ’½ SwiftData: 200.000 Complex Objects
===============
πŸ’½ Student instantiation: 6.7132
πŸ’½ Create students: 18408.6534 (>5h)
7948 students with an A* in Physics
πŸ’½ Read students with A* in Physics: 419.5726
πŸ’½ Fail the cheating Maths students: 314.0178
πŸ’½ DB file size: 174.85 MB
πŸ’½ Delete all students: 35.4886

πŸ’½ ===============
πŸ’½ CoreData: 100 Complex Objects
===============
πŸ’½ Student instantiation: 0.0046
Created 100 students.
πŸ’½ Create students: 8.0364      // this looks odd?
3 students with an A* in Physics
πŸ’½ Read students with A* in Physics: 0.0760
De-graded 0 students.
πŸ’½ Fail the cheating Maths students: 0.0960
πŸ’½ DB file size: 0.05 MB
πŸ’½ Delete all students: 0.1633

πŸ’½ ===============
πŸ’½ CoreData: 1.000 Complex Objects
===============
πŸ’½ Student instantiation: 0.0194
Created 1000 students.
πŸ’½ Create students: 81.1106
42 students with an A* in Physics
πŸ’½ Read students with A* in Physics: 0.3628
De-graded 0 students.
πŸ’½ Fail the cheating Maths students: 0.0963
πŸ’½ DB file size: 0.05 MB
πŸ’½ Delete all students: 0.1683

πŸ’½ ===============
πŸ’½ CoreData: 10.000 Complex Objects
===============
πŸ’½ Student instantiation: 0.1919
Created 10000 students.
πŸ’½ Create students: 826.9841 (~14min)
398 students with an A* in Physics
πŸ’½ Read students with A* in Physics: 3.0860
De-graded 0 students.
πŸ’½ Fail the cheating Maths students: 0.0997
πŸ’½ DB file size: 4.79 MB
πŸ’½ Delete all students: 0.2481

πŸ’½ ===============
πŸ’½ CoreData: 100.000 Complex Objects
===============
πŸ’½ Student instantiation: 1.9152
Created 100000 students.
πŸ’½ Create students: 8918.9621 (~2:28h)
3877 students with an A* in Physics
πŸ’½ Read students with A* in Physics: 32.5651
De-graded 0 students.
πŸ’½ Fail the cheating Maths students: 0.1078
πŸ’½ DB file size: 48.77 MB
πŸ’½ Delete all students: 104.8843

πŸ’½ ===============
πŸ’½ CoreData: 200.000 Complex Objects
===============
CoreData: debug: PostSaveMaintenance: incremental_vacuum with freelist_count - 28 and pages_to_free 15
πŸ’½ Student instantiation: 3.8674
CoreData: debug: PostSaveMaintenance: fileSize 103580952 greater than prune threshold
CoreData: annotation: PostSaveMaintenance: wal_checkpoint(TRUNCATE) 
Created 200000 students.
πŸ’½ Create students: 19687.0992
7817 students with an A* in Physics
πŸ’½ Read students with A* in Physics: 73.8052
De-graded 0 students.
πŸ’½ Fail the cheating Maths students: 0.1214
πŸ’½ DB file size: 98.21 MB
CoreData: debug: PostSaveMaintenance: fileSize 99308512 greater than prune threshold
CoreData: debug: PostSaveMaintenance: incremental_vacuum with freelist_count - 25098 and pages_to_free 25055
CoreData: annotation: PostSaveMaintenance: wal_checkpoint(TRUNCATE) 
πŸ’½ Delete all students: 237.7696

πŸ’½ ===============
πŸ’½ Realm: 100 Complex Objects
===============
πŸ’½ Student instantiation: 0.0028
πŸ’½ Create students: 0.0121
14 students with an A* in Physics
πŸ’½ Read students with A* in Physics: 0.0043
πŸ’½ Fail the cheating Maths students: 0.0025
πŸ’½ DB file size: 123.56 MB
πŸ’½ Delete all students: 0.0023

πŸ’½ ===============
πŸ’½ Realm: 1.000 Complex Objects
===============
πŸ’½ Student instantiation: 0.0129
πŸ’½ Create students: 0.0551
137 students with an A* in Physics
πŸ’½ Read students with A* in Physics: 0.0016
πŸ’½ Fail the cheating Maths students: 0.0023
πŸ’½ DB file size: 123.56 MB
πŸ’½ Delete all students: 0.0035

πŸ’½ ===============
πŸ’½ Realm: 10.000 Complex Objects
===============
πŸ’½ Student instantiation: 0.1318
πŸ’½ Create students: 0.3925
1386 students with an A* in Physics
πŸ’½ Read students with A* in Physics: 0.0158
πŸ’½ Fail the cheating Maths students: 0.0024
πŸ’½ DB file size: 123.56 MB
πŸ’½ Delete all students: 0.0142

πŸ’½ ===============
πŸ’½ Realm: 100.000 Complex Objects
===============
πŸ’½ Student instantiation: 1.3089
πŸ’½ Create students: 3.6597
13292 students with an A* in Physics
πŸ’½ Read students with A* in Physics: 0.1867
πŸ’½ Fail the cheating Maths students: 0.0063
πŸ’½ DB file size: 123.56 MB
πŸ’½ Delete all students: 0.1508

πŸ’½ ===============
πŸ’½ Realm: 200.000 Complex Objects
===============
πŸ’½ Student instantiation: 2.4842
πŸ’½ Create students: 7.0981
26652 students with an A* in Physics
πŸ’½ Read students with A* in Physics: 0.3773
πŸ’½ Fail the cheating Maths students: 0.0062
πŸ’½ DB file size: 123.56 MB
πŸ’½ Delete all students: 0.2842

πŸ’½ ===============
πŸ’½ Realm: 1.000.000 Complex Objects
===============
πŸ’½ Student instantiation: 12.5471
πŸ’½ Create students: 37.3543
132480 students with an A* in Physics
πŸ’½ Read students with A* in Physics: 2.0903
πŸ’½ Fail the cheating Maths students: 0.0149
πŸ’½ DB file size: 364.42 MB
πŸ’½ Delete all students: 1.3790

About

Comparing the performance characteristics of Realm, SwiftData and CoreData

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Swift 100.0%