Test case details Title *
Description (Markdown syntax is allowed)
Preparation Code Preparation HTML (this will be inserted in the <body>
of a valid HTML5 document in standards mode) (useful when testing DOM operations or including libraries)
<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.0-beta.1/ember-template-compiler.js" > </script >
<script src ="https://cdnjs.cloudflare.com/ajax/libs/ember.js/1.13.0-beta.1/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.11.10/vue.min.js" > </script >
<script src ="https://rawgit.com/magnumjs/mag.js/master/dist/mag.0.16.min.js" > </script >
<script src ="https://cdn.rawgit.com/MaxArt2501/object-observe/master/dist/object-observe.min.js" > </script >
<script src ="http://polygit.org/polymer+v1.1.0/components/webcomponentsjs/webcomponents-lite.js" > </script >
<link rel ="import" href ="http://polygit.org/polymer+v1.1.0/components/polymer/polymer.html" >
<template id ="polynode" is ="dom-repeat" >
<span > [[item]]</span >
</template >
jQuery:
<div id ="jq_test" > </div >
<script >
var jqEl = $('#jq_test' );
var children = [];
var jqPush = function (data ) {
children.push ('<span>' + data + '</span>' );
}
var jqClear = function ( ) {
children = [];
jqEl.empty ();
}
var jqAdd = function ( ) {
jqEl.append (children.join ("" ));
}
</script >
<div ng-app ="app" >
Angular:
<span ng-controller ="Ctrl" id ="angList" > <span ng-repeat ="item in data track by $index" > {{::item}}</span > </span >
</div >
<div id ="koapp" >
Knockout:
<span data-bind ="foreach: data" > <span data-bind ="text: $data" > </span > </span >
</div >
<div id ="emapp" > </div >
<script type ="text/x-handlebars" >
Ember :
<span >
{{#each EMapp.data}}<span > {{this}}</span > {{/each}}
</span >
</script >
<div id ="react" >
React: <span id ="reactMountNode" > </span >
</div >
<div id ="mithrilapp" >
Mithril: <span id ="mithrilMountNode" > </span >
</div >
<div id ="vuejs" >
Vuejs: <span id ="vuejsMountNode" > <span v-repeat ="item: data" > {{ item }}</span > </span >
</div >
<div id ="magjsapp" >
MagJS: <div >
<span id ="magjsappMountNode" > <span class ="magjsdata" > <span > </span > </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 = [];
};
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 ) {
return React .createElement ("span" , null , 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 = $('#angList' ).scope ();
window .ANGclear = function ( ){
ang_scope.data = [];
ang_scope.$apply();
};
window .ANGpush = function (data ){
ang_scope.data .push (data);
};
window .ANGapply = function ( ) {
ang_scope.$apply();
};
});
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 .RClear = function ( ) {
reactComp.setState ({data : []})
};
window .RPush = function (entry ) {
var stateData = reactComp.state .data ;
stateData.push (entry);
reactComp.setState ({data : stateData});
}
m.module (document .getElementById ("mithrilMountNode" ), mithapp);
window .Mclear = function ( ) {
m.startComputation ();
MithrilData .splice (0 );
m.endComputation ();
};
window .Mpush = function (data ) {
m.startComputation ();
MithrilData .push (data);
m.endComputation ();
}
var vueInstance = new Vue ({
el : '#vuejsMountNode' ,
data : {
data : []
}
});
window .VueClear = function ( ){
vueInstance.data = []
};
window .VuePush = function (data ){
vueInstance.data .push (data);
};
var Mag JSData = [];
var magjsdataNode = {
view : function (state, props ) {
state.magjsdata = props.MagJSData .map (function (data ){
return {span : data }
});
}
}
var magjsapp = {
view : function (state, props ) {
mag.module ("magjsappMountNode" ,magjsdataNode, props);
}
}
mag.module ("magjsapp" ,magjsapp, {Mag JSData :Mag JSData});
window .MagJSclear = function ( ) {
Mag JSData.splice (0 );
};
window .MagJSpush = function (data ) {
Mag JSData.push (data);
};
window .MagJSforceRedraw = function (data ) {
mag.redraw (true );
}
Mag JSclear();
});
</script >
Setup JS
Teardown JS
Test cases
Test #1 Title *
Async
Code * ANGclear ();
for (var i = 0 ; i < 100 ; i++) {
ANGpush ("nitem" + getId (i));
}
ANGapply ();
Test #2 Title *
Async
Code * Mag JSclear();
for (var i = 0 ; i < 100 ; i++) {
Mag JSpush("mjsit" +getId (i));
}
Mag JSforceRedraw();
Title *
Async
Code * RClear ();
for (var i = 0 ; i < 100 ; i++)
RPush ("ritem" + getId (i));
Title *
Async
Code * Mclear ();
for (var i = 0 ; i < 100 ; i++)
Mpush ("mitem" + getId (i));
Title *
Async
Code * VueClear ();
for (var i = 0 ; i < 100 ; i++)
VuePush ("vitem" + getId (i));
Title *
Async
Code * EMclear ();
for (var i = 0 ; i < 100 ; i++)
EMpush ("eitem" + getId (i));
Title *
Async
Code * jqClear ();
for (var i = 0 ; i < 100 ; i++) {
jqPush ('jq-item' + getId (i));
}
jqAdd ();
Title *
Async
Code * KOclear ();
for (var i = 0 ; i < 100 ; i++)
KOpush ("kitem" + getId (i));
Title *
Async
Code * var polynode=document .getElementById ('polynode' );
polynode.items =[];
for (var i = 0 ;i<100 ;i++)
polynode.push ('items' ,'polymer-' +getId (i));