我正在测试AngularJS的性能,以决定它是否适合我们的应用程序。为了测量和比较DOM创建的速度,我创建了一个JSFiddle示例,可以在其中玩转不同数量的项目来创建。
目标是按其项目顺序显示n个随机用户。根据项目类型有不同的内容,如果用户是保密的,则根本不应该显示。
HTML:
然而,我注意到随着项目数量的增加,性能显著降低。在大约2500个项目时,速度变得太慢。
目标是按其项目顺序显示n个随机用户。根据项目类型有不同的内容,如果用户是保密的,则根本不应该显示。
HTML:
<div ng-repeat="user in users | orderBy:'project'" post-repeat-directive
ng-if="user.secretagent == false"
class="user"
ng-class="{male: (user.gender == 'm'), female: (user.gender != 'm')}"
ng-switch="user.project">
<h2>{{user.name}}</h2>
Project: {{user.project}}
<em ng-switch-when="fame">[fame]</em>
<em ng-switch-when="idol">[idol]</em>
</div>
JavaScript:
angular.module('AngularBench', [])
.config(['$compileProvider', function ($compileProvider) {
$compileProvider.debugInfoEnabled(false);
}])
.controller("benchmarkController", ['$scope', 'TimeTracker', function($scope, TimeTracker) {
$scope.result = undefined;
$scope.users = [];
$scope.benchmark = function(size) {
TimeTracker.clockStartDate(size);
var users = getUsers(size);
$scope.users = users;
$scope.$watch(
function () { return TimeTracker.getDuration(); },
function(newVal, oldVal) { $scope.result = newVal; },
true
);
};
}])
.factory('TimeTracker', function() {
var start, end, duration;
return {
clockStartDate: function() {
start = Date.now();
},
clockEndDate: function() {
end = Date.now();
duration = (end - start) / 1000;
},
getDuration: function() {
return duration;
}
};
})
.directive('postRepeatDirective', ['$timeout', 'TimeTracker', function($timeout, TimeTracker) {
return function(scope, element, attrs) {
if (scope.$last){
$timeout(function(){
TimeTracker.clockEndDate();
});
}
};
}]);
function getUsers(size) {
var users = [];
for (var i=0; i<size; i++) {
var user = {
name: 'User ' + i,
gender: Math.random() > 0.5 ? 'm' : 'w',
project: Math.random() > 0.25 ? 'fame' : 'idol',
secretagent: Math.random() > 0.95
};
users.push(user);
}
return users;
}
然而,我注意到随着项目数量的增加,性能显著降低。在大约2500个项目时,速度变得太慢。
我知道常见的建议是使用分页或自动滚动,但这不是关于在ngRepeat中找到大列表的替代解决方案。您有什么建议可以提高性能吗?