Test case details

Preparation Code

<!-- Jquery --> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.0/angular.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.3.0/knockout-min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/1.3.0/handlebars.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/ember.js/1.13.4/ember-template-compiler.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/ember.js/1.13.4/ember.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.13.3/react.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/mithril/0.2.0/mithril.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/0.12.7/vue.min.js"></script> <!--[if IE]><script src="https://rawgit.com/jakearchibald/es6-promise/master/dist/es6-promise.min.js"></script><![endif]--> <script src="https://rawgit.com/magnumjs/mag.js/master/dist/mag.0.11.9.min.js"></script> <script src="https://cdn.rawgit.com/MaxArt2501/object-observe/master/dist/object-observe.min.js"></script> <script src="https://rawgit.com/magnumjs/mag.js/master/src/mag.addons.js"></script> <!-- Jquery --> jQuery: <div id="jq_test"></div> <script> var jqEl = $('#jq_test'); var children = ''; var jqPush = function (data) { jqEl.append('<span>' + data + '</span>'); } var jqClear = function () {   jqEl.empty(); } </script> <!-- Angular --> <div ng-app="app" ng-jq>   Angular: <span ng-controller="Ctrl" id="angList"><span ng-repeat="item in data track by item">{{::item}}</span></span> </div> <!-- Knockout --> <div id="koapp">   Knockout:   <span data-bind="foreach: data"><span data-bind="text: $data"></span></span> </div> <!-- Ember --> <div id="emapp"></div> <script type="text/x-handlebars">   Ember:   <span>     {{#each EMapp.data}}<span>{{this}}</span>{{/each}}   </span> </script> <!-- React --> <div id="react">   React: <span id="reactMountNode"></span> </div> <!-- Mithril --> <div id="mithrilapp">   Mithril: <span id="mithrilMountNode"></span> </div> <!-- Vuejs --> <div id="vuejs">         Vuejs: <span id="vuejsMountNode"><span v-repeat="item: data">{{ item }}</span></span> </div>   <!-- MagJS -->   <div id="magjsapp">     MagJS: <div>             <span id="magjsappMountNode"><span class="magjsdata"></span></span></div>   </div> <script> window.getId = function(idx)   {     var d = Date.now() + "";     return idx + "-" + d.substring(d.length - 6);   }; angular.module('app', []) .controller('Ctrl', ['$scope', Ctrl]); function Ctrl($scope) {     $scope.data = [];     $scope.push = function(data) {         $scope.data.push(data);         //$scope.$evalAsync();     } }; var KOData = ko.observableArray(); var KOviewmodel = {data: KOData}; var ENV = {EXTEND_PROTOTYPES: false}; var ReactComponent = React.createClass({displayName: 'PerfTest',   getInitialState: function() {     return { data: [] };   },   render: function() {     return (        React.createElement("span", null,         this.state.data.map(function(result, i) {           return React.createElement("span", {key: i}, result);         })       )     );   } }); var MithrilData = new Array(); var mithapp = {   controller: function() {     this.data = MithrilData;   },   view: function(ctrl) {     return m("span", [ctrl.data.map(function(datum) { return m('span', datum); })]);   } } $(document).ready(function() {   EMapp = Ember.Application.create({     rootElement: '#emapp'   });   EMapp.data = Ember.A();   window.EMclear = function () {     EMapp.data.clear();   };   window.EMpush = function (data) {     EMapp.data.pushObject(data);   };   angular.element(document).ready(function() {     var ang_scope = angular.element(document.getElementById('angList')).scope();     window.ANGclear = function(){ ang_scope.data = [];       ang_scope.$evalAsync();     };     window.ANGpush = function(data){         ang_scope.push(data);     };   });   ko.applyBindings(KOviewmodel, document.getElementById('koapp'));   window.KOclear = function (){     KOData.splice(0, KOData().length);   };   window.KOpush = function (data){     KOData.push(data);   };   var reactComp = React.render( React.createElement(ReactComponent, null), document.getElementById('reactMountNode')); window.reactComp = reactComp;   window.RClear = function() {     //reactComp.setState({data: []})     reactComp.state.data = [];   };   window.RPush = function(entry) {     var stateData = reactComp.state.data;     stateData.push(entry);   }   m.mount(document.getElementById("mithrilMountNode"), m.component(mithapp));   window.Mclear = function() {     m.startComputation();     MithrilData.splice(0);     m.endComputation();   };   window.Mpush = function(data) {     MithrilData.push(data);   }     var vueInstance = new Vue({           el: '#vuejsMountNode',           data: {                   data: []           }   });     window.VueClear = function(){           vueInstance.data = []   };   window.VuePush = function(data){                 vueInstance.data.push(data);   };     var MagJSData = ["TestMagJS"];   var magjsdataNode = {     view: function(state, props) {       state.magjsdata = MagJSData;     }   }   var magjsapp = {     view: function(state, props) {       state.div = mag.module("magjsappMountNode",magjsdataNode);     }   }   mag.module("magjsapp",magjsapp);   window.MagJSclear = function() {     MagJSData.splice(0);   };   window.MagJSpush = function(data) {     MagJSData.push(data);   };   window.MagJSforceRedraw = function(data) {     mag.redraw(true);   }   MagJSclear(); }); </script>

Test cases

Test #1

ANGclear(); for (var i = 0; i < 1000; i++) {   ANGpush("nitem" + getId(i)); }

Test #2

KOclear(); for (var i = 0; i < 1000; i++)   KOpush("kitem" + getId(i));

Test #3

RClear(); for (var i = 0; i < 1000; i++)   RPush("ritem" + getId(i)); window.reactComp.setState({   data: window.reactComp.state.data });

Test #4

Mclear(); for (var i = 0; i < 1000; i++)   Mpush("mitem" + getId(i));

Test #5

VueClear(); for (var i = 0; i < 1000; i++)   VuePush("vitem" + getId(i));

Test #6

EMclear(); for (var i = 0; i < 1000; i++)   EMpush("eitem" + getId(i));

Test #7

jqClear(); for (var i = 0; i < 1000; i++) {   jqPush('jq-item' + getId(i)); }

Test #8

MagJSclear(); for (var i = 0; i < 1000; i++) {   MagJSpush("mjsit" + getId(i)); } MagJSforceRedraw();