Angular Js vs Knockout
JavaScript performance comparison
Info
Testing performance of subscribers/watchers and updating the ui
Preparation code
<script src="http://code.jquery.com/jquery-1.7.2.min.js">
</script>
<script src="http://code.angularjs.org/angular-1.0.1.min.js">
</script>
<script src="
http://cdnjs.cloudflare.com/ajax/libs/knockout/2.2.0/knockout-min.js">
</script>
<script>
var Ctrl = function($scope) {
$scope.data = "";
$scope.numberofChanges1 = 0;
$scope.numberofChanges2 = 0;
$scope.numberofChanges3 = 0;
$scope.numberofChanges4 = 0;
$scope.numberofChanges5 = 0;
$scope.numberofChanges6 = 0;
$scope.numberofChanges7 = 0;
$scope.numberofChanges8 = 0;
$scope.numberofChanges9 = 0;
$scope.numberofChanges10 = 0;
$scope.$watch('data', function(a,b,c){
$scope.numberofChanges1++;
});
$scope.$watch('data', function(a,b,c){
$scope.numberofChanges2++;
});
$scope.$watch('data', function(a,b,c){
$scope.numberofChanges3++;
});
$scope.$watch('data', function(a,b,c){
$scope.numberofChanges4++;
});
$scope.$watch('data', function(a,b,c){
$scope.numberofChanges5++;
});
$scope.$watch('data', function(a,b,c){
$scope.numberofChanges6++;
});
$scope.$watch('data', function(a,b,c){
$scope.numberofChanges7++;
});
$scope.$watch('data', function(a,b,c){
$scope.numberofChanges8++;
});
$scope.$watch('data', function(a,b,c){
$scope.numberofChanges9++;
});
$scope.$watch('data', function(a,b,c){
$scope.numberofChanges10++;
});
}
angular.element(document).ready(function() {
var ang_scope = $('#angList').scope();
ANGclear = function() {
ang_scope.data = "OMGOMGOMG";
};
ANGpush = function() {
ang_scope.data += "OMGOMGOMG";
ang_scope.$apply();
};
}); </script>
<script>
var KOData = ko.observable("");
var KOUpdates1 = ko.observable(0);
var KOUpdates2 = ko.observable(0);
var KOUpdates3 = ko.observable(0);
var KOUpdates4 = ko.observable(0);
var KOUpdates5 = ko.observable(0);
var KOUpdates6 = ko.observable(0);
var KOUpdates7 = ko.observable(0);
var KOUpdates8 = ko.observable(0);
var KOUpdates9 = ko.observable(0);
var KOUpdates10 = ko.observable(0);
KOData.subscribe(function(){
KOUpdates1(KOUpdates1() + 1);
});
KOData.subscribe(function(){
KOUpdates2(KOUpdates2() + 1);
});
KOData.subscribe(function(){
KOUpdates3(KOUpdates3() + 1);
});
KOData.subscribe(function(){
KOUpdates4(KOUpdates4() + 1);
});
KOData.subscribe(function(){
KOUpdates5(KOUpdates5() + 1);
});
KOData.subscribe(function(){
KOUpdates6(KOUpdates6() + 1);
});
KOData.subscribe(function(){
KOUpdates7(KOUpdates7() + 1);
});
KOData.subscribe(function(){
KOUpdates8(KOUpdates8() + 1);
});
KOData.subscribe(function(){
KOUpdates9(KOUpdates9() + 1);
});
KOData.subscribe(function(){
KOUpdates10(KOUpdates10() + 1);
});
var KOviewmodel = {data: KOData, updates1: KOUpdates1, updates2: KOUpdates2, updates3: KOUpdates3, updates4: KOUpdates4, updates5: KOUpdates5, updates6: KOUpdates6, updates7: KOUpdates7, updates8: KOUpdates8, updates9: KOUpdates9, updates10: KOUpdates10};
ko.applyBindings(KOviewmodel, document.getElementById('koapp'));
var KOclear = function (){
KOData("");
};
var KOpush = function (){
var old = KOData()
KOData(old += "OMGOMGOMG");
};
</script>
<!-- Angular -->
<div style="width: 200px; height: 300px; overflow: hidden" ng-app>
Angular:
<span ng-controller="Ctrl" id="angList">
<span> {{numberofChanges1}}</span>
<span> {{numberofChanges2}}</span>
<span> {{numberofChanges3}}</span>
<span> {{numberofChanges4}}</span>
<span> {{numberofChanges5}}</span>
<span> {{numberofChanges6}}</span>
<span> {{numberofChanges7}}</span>
<span> {{numberofChanges8}}</span>
<span> {{numberofChanges9}}</span>
<span> {{numberofChanges10}}</span>
<span> {{numberofChanges1}}</span>
<span> {{numberofChanges2}}</span>
<span> {{numberofChanges3}}</span>
<span> {{numberofChanges4}}</span>
<span> {{numberofChanges5}}</span>
<span> {{numberofChanges6}}</span>
<span> {{numberofChanges7}}</span>
<span> {{numberofChanges8}}</span>
<span> {{numberofChanges9}}</span>
<span> {{numberofChanges10}}</span>
<span> {{numberofChanges1}}</span>
<span> {{numberofChanges2}}</span>
<span> {{numberofChanges3}}</span>
<span> {{numberofChanges4}}</span>
<span> {{numberofChanges5}}</span>
<span> {{numberofChanges6}}</span>
<span> {{numberofChanges7}}</span>
<span> {{numberofChanges8}}</span>
<span> {{numberofChanges9}}</span>
<span> {{numberofChanges10}}</span>
<span> {{numberofChanges1}}</span>
<span> {{numberofChanges2}}</span>
<span> {{numberofChanges3}}</span>
<span> {{numberofChanges4}}</span>
<span> {{numberofChanges5}}</span>
<span> {{numberofChanges6}}</span>
<span> {{numberofChanges7}}</span>
<span> {{numberofChanges8}}</span>
<span> {{numberofChanges9}}</span>
<span> {{numberofChanges10}}</span>
<span> {{numberofChanges1}}</span>
<span> {{numberofChanges2}}</span>
<span> {{numberofChanges3}}</span>
<span> {{numberofChanges4}}</span>
<span> {{numberofChanges5}}</span>
<span> {{numberofChanges6}}</span>
<span> {{numberofChanges7}}</span>
<span> {{numberofChanges8}}</span>
<span> {{numberofChanges9}}</span>
<span> {{numberofChanges10}}</span>
<span> {{numberofChanges1}}</span>
<span> {{numberofChanges2}}</span>
<span> {{numberofChanges3}}</span>
<span> {{numberofChanges4}}</span>
<span> {{numberofChanges5}}</span>
<span> {{numberofChanges6}}</span>
<span> {{numberofChanges7}}</span>
<span> {{numberofChanges8}}</span>
<span> {{numberofChanges9}}</span>
<span> {{numberofChanges10}}</span>
<span> {{numberofChanges1}}</span>
<span> {{numberofChanges2}}</span>
<span> {{numberofChanges3}}</span>
<span> {{numberofChanges4}}</span>
<span> {{numberofChanges5}}</span>
<span> {{numberofChanges6}}</span>
<span> {{numberofChanges7}}</span>
<span> {{numberofChanges8}}</span>
<span> {{numberofChanges9}}</span>
<span> {{numberofChanges10}}</span>
<span> {{numberofChanges1}}</span>
<span> {{numberofChanges2}}</span>
<span> {{numberofChanges3}}</span>
<span> {{numberofChanges4}}</span>
<span> {{numberofChanges5}}</span>
<span> {{numberofChanges6}}</span>
<span> {{numberofChanges7}}</span>
<span> {{numberofChanges8}}</span>
<span> {{numberofChanges9}}</span>
<span> {{numberofChanges10}}</span>
<span> {{numberofChanges1}}</span>
<span> {{numberofChanges2}}</span>
<span> {{numberofChanges3}}</span>
<span> {{numberofChanges4}}</span>
<span> {{numberofChanges5}}</span>
<span> {{numberofChanges6}}</span>
<span> {{numberofChanges7}}</span>
<span> {{numberofChanges8}}</span>
<span> {{numberofChanges9}}</span>
<span> {{numberofChanges10}}</span>
<span> {{numberofChanges1}}</span>
<span> {{numberofChanges2}}</span>
<span> {{numberofChanges3}}</span>
<span> {{numberofChanges4}}</span>
<span> {{numberofChanges5}}</span>
<span> {{numberofChanges6}}</span>
<span> {{numberofChanges7}}</span>
<span> {{numberofChanges8}}</span>
<span> {{numberofChanges9}}</span>
<span> {{numberofChanges10}}</span>
AngularTestArea Data: {{data}}
</span>
</div>
<!-- Knockout -->
<div style="width: 200px; height: 300px; overflow: hidden" id="koapp">
Knockout:
<span>
KnockoutTestArea Subscriber Updates: <span data-bind="text: data"></span>
<span data-bind="text: updates1"></span>
<span data-bind="text: updates1"></span>
<span data-bind="text: updates1"></span>
<span data-bind="text: updates1"></span>
<span data-bind="text: updates1"></span>
<span data-bind="text: updates1"></span>
<span data-bind="text: updates1"></span>
<span data-bind="text: updates1"></span>
<span data-bind="text: updates1"></span>
<span data-bind="text: updates1"></span>
<span data-bind="text: updates2"></span>
<span data-bind="text: updates2"></span>
<span data-bind="text: updates2"></span>
<span data-bind="text: updates2"></span>
<span data-bind="text: updates2"></span>
<span data-bind="text: updates2"></span>
<span data-bind="text: updates2"></span>
<span data-bind="text: updates2"></span>
<span data-bind="text: updates2"></span>
<span data-bind="text: updates2"></span>
<span data-bind="text: updates3"></span>
<span data-bind="text: updates3"></span>
<span data-bind="text: updates3"></span>
<span data-bind="text: updates3"></span>
<span data-bind="text: updates3"></span>
<span data-bind="text: updates3"></span>
<span data-bind="text: updates3"></span>
<span data-bind="text: updates3"></span>
<span data-bind="text: updates3"></span>
<span data-bind="text: updates3"></span>
<span data-bind="text: updates4"></span>
<span data-bind="text: updates4"></span>
<span data-bind="text: updates4"></span>
<span data-bind="text: updates4"></span>
<span data-bind="text: updates4"></span>
<span data-bind="text: updates4"></span>
<span data-bind="text: updates4"></span>
<span data-bind="text: updates4"></span>
<span data-bind="text: updates4"></span>
<span data-bind="text: updates4"></span>
<span data-bind="text: updates5"></span>
<span data-bind="text: updates5"></span>
<span data-bind="text: updates5"></span>
<span data-bind="text: updates5"></span>
<span data-bind="text: updates5"></span>
<span data-bind="text: updates5"></span>
<span data-bind="text: updates5"></span>
<span data-bind="text: updates5"></span>
<span data-bind="text: updates5"></span>
<span data-bind="text: updates5"></span>
<span data-bind="text: updates6"></span>
<span data-bind="text: updates6"></span>
<span data-bind="text: updates6"></span>
<span data-bind="text: updates6"></span>
<span data-bind="text: updates6"></span>
<span data-bind="text: updates6"></span>
<span data-bind="text: updates6"></span>
<span data-bind="text: updates6"></span>
<span data-bind="text: updates6"></span>
<span data-bind="text: updates6"></span>
<span data-bind="text: updates7"></span>
<span data-bind="text: updates7"></span>
<span data-bind="text: updates7"></span>
<span data-bind="text: updates7"></span>
<span data-bind="text: updates7"></span>
<span data-bind="text: updates7"></span>
<span data-bind="text: updates7"></span>
<span data-bind="text: updates7"></span>
<span data-bind="text: updates7"></span>
<span data-bind="text: updates7"></span>
<span data-bind="text: updates8"></span>
<span data-bind="text: updates8"></span>
<span data-bind="text: updates8"></span>
<span data-bind="text: updates8"></span>
<span data-bind="text: updates8"></span>
<span data-bind="text: updates8"></span>
<span data-bind="text: updates8"></span>
<span data-bind="text: updates8"></span>
<span data-bind="text: updates8"></span>
<span data-bind="text: updates8"></span>
<span data-bind="text: updates9"></span>
<span data-bind="text: updates9"></span>
<span data-bind="text: updates9"></span>
<span data-bind="text: updates9"></span>
<span data-bind="text: updates9"></span>
<span data-bind="text: updates9"></span>
<span data-bind="text: updates9"></span>
<span data-bind="text: updates9"></span>
<span data-bind="text: updates9"></span>
<span data-bind="text: updates9"></span>
<span data-bind="text: updates10"></span>
<span data-bind="text: updates10"></span>
<span data-bind="text: updates10"></span>
<span data-bind="text: updates10"></span>
<span data-bind="text: updates10"></span>
<span data-bind="text: updates10"></span>
<span data-bind="text: updates10"></span>
<span data-bind="text: updates10"></span>
<span data-bind="text: updates10"></span>
<span data-bind="text: updates10"></span>
</span>
</div>
Preparation code output
Test runner
Warning! For accurate results, please disable Firebug before running the tests. (Why?)
Java applet disabled.
| Test | Ops/sec | |
|---|---|---|
Angular 10 |
|
pending… |
Knockout 10 |
|
pending… |
Angular 100 |
|
pending… |
Knockout 100 |
|
pending… |
Angular 500 |
|
pending… |
Knockout 500 |
|
pending… |
Angular 1000 |
|
pending… |
Knockout 1000 |
|
pending… |
Compare results of other browsers
Revisions
You can edit these tests or add even more tests to this page by appending /edit to the URL. Here’s a list of current revisions for this page:
- Revision 1: published by tim
- Revision 2: published by tim
- Revision 3: published by tim
- Revision 4: published
- Revision 5: published
- Revision 7: published by thelinuxlich
- Revision 8: published
- Revision 10: published
- Revision 12: published
- Revision 13: published
- Revision 14: published
- Revision 15: published
- Revision 16: published
- Revision 17: published
- Revision 18: published by Anton Heryanto
- Revision 23: published
- Revision 25: published
- Revision 26: published by Imarrero
- Revision 27: published
- Revision 28: published
- Revision 29: published
- Revision 30: published
- Revision 31: published
- Revision 32: published
- Revision 33: published
- Revision 34: published
- Revision 35: published
- Revision 36: published by Dennis Jakobsen
- Revision 37: published
- Revision 38: published
- Revision 39: published
- Revision 42: published
- Revision 43: published
- Revision 44: published
- Revision 45: published
- Revision 46: published
- Revision 47: published
- Revision 48: published
- Revision 49: published
- Revision 50: published
- Revision 51: published
- Revision 53: published
- Revision 54: published
- Revision 55: published
- Revision 56: published
- Revision 58: published by Nikos M.
- Revision 59: published by Nikos M.
- Revision 60: published
- Revision 61: published
- Revision 62: published by Nikos M.
- Revision 63: published by Andreas
- Revision 64: published by Kris Test
- Revision 66: published by Andrey
- Revision 67: published
- Revision 68: published
- Revision 69: published
- Revision 70: published
- Revision 71: published
- Revision 72: published
- Revision 73: published
- Revision 75: published
- Revision 76: published
- Revision 77: published
- Revision 79: published
- Revision 80: published
0 comments
Comment form temporarily disabled.