【发布时间】:2014-02-20 07:36:45
【问题描述】:
在使用 AngularFire 测试 Firebase 时,我很惊讶它的速度有多慢。经过进一步测试,我发现不是 Firebase 慢,而是 AngularFire 慢(在 Firefox v26.0 中非常慢)。
我的用例是我需要访问给定父级的多个子级。孩子的总数可能会达到数千人,因此一次获取所有孩子不是一种选择。此外,它们需要从祖父母那里访问,因此按优先级查询并不总是一种选择。
在这个使用 AngularFire 的示例中我做错了什么(慢): http://plnkr.co/edit/eML3HF3RtchIU26EGVaw?p=preview
使用 AngularFire 访问子级的要点:
function getChild(childID) {
recordCount++;
myC.children[childID] = $firebase(new Firebase(childrenUrl + childID));
myC.children[childID].$on('loaded', function () {
returnCount++;
checkReturnCount();
});
}
function checkReturnCount() {
if (recordCount != 0 && recordCount == returnCount) {
var diff = (new Date).getTime() - start;
myC.log.push("Loaded " + parent.FirstName + "'s children in " + diff + "ms.");
$scope.$apply();
}
}
为了比较,请看这个不使用任何 Angular 插件的示例(快速): http://plnkr.co/edit/GA17FEnHu7p8wAiDXA5b?p=preview
在没有 AngularFire 的情况下访问孩子的要点
function getChild(childID) {
recordCount++;
var tempRef = new Firebase(childrenUrl + childID);
tempRef.on('value', function (data) {
myC.children[childID] = data.val();
returnCount++;
checkReturnCount();
});
}
function checkReturnCount() {
if (recordCount != 0 && recordCount == returnCount) {
var diff = (new Date).getTime() - start;
myC.log.push("Loaded " + parent.FirstName + "'s children in " + diff + "ms.");
$scope.$apply();
}
}
【问题讨论】:
-
AngularFire 似乎慢了大约 3 倍。我在 Firefox 26 上看到了这些数字——AngularFire Parent 1 用了 973ms,Parent 2 用了 491ms,Parent 3 用了 641ms;与普通 Firebase 父级 1 的 289 毫秒,父级 2 的 146 毫秒,父级 3 的 169 毫秒。这与您的测试相符吗?
-
类似,是的。它因页面加载而异,但 AngularFire 始终慢约 3 倍。
-
这似乎可能来自将事物放入 $compile 阶段所需的 $timeout 调用以及 $compile 本身,两者都使用延迟回调,这也解释了 Firefox 中解释 setTimout 为零的差异20 - 150 毫秒
-
好的。 AngularFire 库是否有理由不使用承诺?或者是吗?我基本上是在使用 Promise 编写自己的版本,并且没有库所做的滞后。
标签: performance firebase angularfire