移动端orm框架性能测评
flutter_orm_plugin 发布以来,不少团队试用了,我发现大家对这类数据库相关的库,第一反应就是性能如何,之前确实没做太多行业对比,最近觉得还是有必要做一下性能测试,给大家一个交代的。
在ios端,业界比较常用的orm框架应该是苹果官方推出的coredata,还有就是realm了。在android端orm框架我挑了三个比较常用的,greendao,realm和activeandroid。我会用flutter_orm_plugin跟上面提到的ios和android端orm框架做对比。 下面我会分别给出测试用例,测试代码,还有最终数据比较的结果。
测试用例
测试用例我列了以下这些
- 10000次插入数据
- 使用批量接口10000次插入数据
- 10000次读取数据
- 10000次修改数据
- 使用批量接口10000次修改数据
- 10000次删除数据
- 使用批量接口10000次删除数据
为什么会有普通插入数据和使用批量接口插入数据的区别,大部分orm框架都会对批量操作有一定的优化,所以需要对批量操作进行测试,但是在平时使用,不一定都能用上批量接口(例如多次数据操作不在同一代码块,或者在不同的模块中都要操作数据),所以我们会分别对普通操作和批量操作进行测试。
android 测试代码
首先我们给出flutter_orm_plugin 的测试代码,由于不想因为flutter和原生channel通讯产生误差,我们直接用Luakit来写lua代码做测试(greendao、realm、activeandroid、coredata都不涉及flutter和原生channel通讯),flutter_orm_plugin其实底层就是luakit的orm框架,这个不影响测试准确性。
循环插入
Luakit定义orm模型结构并做10000次插入,下面的代码是ios和android通用的。
local Student = {
__dbname__ = "test.db",
__tablename__ = "Student",
studentId = {"TextField",{primary_key = true}},
name = {"TextField",{}},
claName = {"TextField",{}},
teacherName = {"TextField",{}},
score = {"RealField",{}},
}
local params = {
name = "Student",
args = Student,
}
Table.addTableInfo(params,function ()
local studentTable = Table("Student”)
for i=1,10000 do
local s = {
studentId = "studentId"..i,
name = "name"..i,
claName = "claName"..i,
teacherName = "teacherName"..i,
score = 90,
}
studentTable(s):save()
end
end)
activeandroid定义orm模型结构并做10000次插入
@Table(name = "Students")
public class Student extends Base {
@Column(name = "studentId")
public String studentId;
@Column(name = "name")
public String name;
@Column(name = "claName")
public String claName;
@Column(name = "teacherName")
public String teacherName;
@Column(name = "score")
public float score;
public Student() {
super();
}
@Override
public String toString() {
return this.studentId;
}
}
for (int i=0 ; i<10000 ;i++) {
ActiveAndroid.beginTransaction();
Student s = new Student();
s.studentId = "studentId"+i;
s.name = "name"+i;
s.teacherName = "teacherName"+i;
s.claName = "claName"+i;
s.score = 90;
s.save();
ActiveAndroid.setTransactionSuccessful();
ActiveAndroid.endTransaction();
}
realm android 定义orm模型结构并做10000次插入
public class StudentRealm extends RealmObject {
@PrimaryKey
private String studentId;
@Required
private String name;
@Required
private String teacherName;
@Required
private String claName;
private float score;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getClaName() {
return claName;
}
public void setClaName(String ClaName) {
this.claName = claName;
}
public String getTeacherName() {
return teacherName;
}
public void setTeacherName(String teacherName) {
this.teacherName = teacherName;
}
public String getStudentId() {
return studentId;
}
public void setStudentId(String id) {
this.studentId = id;
}
public float getScore() {
return score;
}
public void setScore(float score) {
this.score = score;
}
}
for (int i=0 ; i<10000 ;i++) {
realm.beginTransaction();
StudentRealm realmStudent = realm.createObject(StudentRealm.class,"studentId"+i);
realmStudent.setName("name"+i);
realmStudent.setTeacherName("setTeacherName"+i);
realmStudent.setClaName("setClaName"+i);
realmStudent.setScore(90);
realm.commitTransaction();
}
GreenDao定义orm模型结构并做10000次插入
@Entity()
public class Student {
@Id
private String studentId;