实验
2018-06-17 16:27 更新
为了证实setData的性能问题,可以写简单的测试例子去测试:
动态绑定1000条数据的列表进行性能测试,这里测试了三种情况:
- 最优绑定: 在内存中添加完毕后最后执行setData操作。
- 最差绑定: 在添加一条记录执行一次setData操作。
- 最智能绑定:不管中间进行了什么操作,在运行结束时执行一次脏检查,对需要设置的数据进行setData操作。
参考代码如下:
// page1.wxml
<view bindtap="worse">
<text class="user-motto">worse数据绑定测试</text>
</view>
<view bindtap="best">
<text class="user-motto">best数据绑定测试</text>
</view>
<view bindtap="digest">
<text class="user-motto">digest数据绑定测试</text>
</view>
<view class="list">
<view wx:for="{{list}}" wx:for-index="index"wx:for-item="item">
<text>{{item.id}}</text>---<text>{{item.name}}</text>
</view>
</view>
// page1.js
worse: function () {
var start = +new Date();
for (var i = 0; i < 1000; i++) {
this.data.list.push({id: i, name: Math.random()});
this.setData({list: this.data.list});
}
var end = +new Date();
console.log(end - start);
},
best: function () {
var start = +new Date();
for (var i = 0; i < 1000; i++) {
this.data.list.push({id: i, name: Math.random()});
}
this.setData({list: this.data.list});
var end = +new Date();
console.log(end - start);
},
digest: function () {
var start = +new Date();
for (var i = 0; i < 1000; i++) {
this.data.list.push({id: i, name: Math.random()});
}
var data = this.data;
var $data = this.$data;
var readyToSet = {};
for (k in data) {
if (!util.$isEqual(data[k], $data[k])) {
readyToSet[k] = data[k];
$data[k] = util.$copy(data[k], true);
}
}
if (Object.keys(readyToSet).length) {
this.setData(readyToSet);
}
var end = +new Date();
console.log(end - start);
},
onLoad: function () {
this.$data = util.$copy(this.data, true);
}
在经过十次刷新运行测试后得出以下结果:
worse(ms) | best(ms) | digest(ms) |
---|---|---|
8540 | 24 | 23 |
7784 | 22 | 25 |
7884 | 23 | 25 |
8317 | 22 | 25 |
7968 | 28 | 26 |
7939 | 21 | 23 |
7853 | 22 | 23 |
8053 | 25 | 23 |
8007 | 24 | 29 |
8168 | 25 | 24 |
实现同样的逻辑,性能数据却相差40倍左右。由此可以看出,在开发过程中,一定要避免同一流程内多次 setData 操作。
以上内容是否对您有帮助:
← 原理
更多建议: