aLight: benchmark

HTML

<script src="http://ajax.aspnetcdn.com/ajax/knockout/knockout-2.2.1.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.0.6/angular.min.js"></script>
<script src="http://angularlight.org/bin/alight_0.49b.min.js"></script>
<script src="http://yourjavascript.com/24422127193/basis-ui.js"></script>
<div id="menu">
    <div data-bind="visible: !processing()">
        <span>Row count:</span>
        <input type="text" data-bind="value: rowCount" />
        <button data-bind="click: jqBench">Start jquery bench</button>
        <button data-bind="click: ngBench">Start angular bench</button>
        <button data-bind="click: koBench">Start knockout bench</button>
        <button data-bind="click: alBench">Start aLight bench</button>
        <button data-bind="click: alBench2">Start aLight bench (inline)</button>
        <button data-bind="click: basis">Start basis.js bench</button>
    </div>
    <table class="results" border="1">
        <tr>
            <th></th>
            <th>filling</th>
            <th>updating</th>
        </tr>
        <tr>
            <th>jquery</th>
            <td><span data-bind="text: results.jqFill"></span> ms</td>
            <td><span data-bind="text: results.jqUpdate"></span> ms</td>
        </tr>
        <tr>
            <th>angular</th>
            <td><span data-bind="text: results.ngFill"></span> ms</td>
            <td><span data-bind="text: results.ngUpdate"></span> ms</td>
        </tr>
        <tr>
            <th>knockout</th>
            <td><span data-bind="text: results.koFill"></span> ms</td>
            <td><span data-bind="text: results.koUpdate"></span> ms</td>
        </tr>
        <tr>
            <th>aLight</th>
            <td><span data-bind="text: results.alFill"></span> ms</td>
            <td><span data-bind="text: results.alUpdate"></span> ms</td>
        </tr>
        <tr>
            <th>aLight (inline)</th>
            <td><span data-bind="text: results.alFill2"></span> ms</td>
        ...

JavaScript

'use strict';

////////////////////

var basisUI = basis.require('basis.ui');
var basisList = new basisUI.Node({
    container: document.getElementById('al-list').parentNode,
    template: '<ul/>',
    childClass: {
        template: '<li>basis.ui: {val}</li>',
        binding: {
            val: 'val'
        }
    }
});

function basisFill(n, callback){
    basisList.setChildNodes(basis.array.create(n, function(idx){
        return {
            val: idx + 1
        };
    }));
    
    setTimeout(callback, 0);
}

function basisUpdate(n, callback){
    basisList.childNodes.forEach(function(node){
        node.val += ' ' + node.val;
        node.updateBind('val');
    });
    
    setTimeout(callback, 0);
}

function basisClear(callback){
    basisList.clear();
    
    setTimeout(callback, 0);
}

////////////////////

function jqFill(n) {
    var i, li,
    ul = $("#jq-list");
    for (i = 0; i < n; i += 1) {
        li = '<li>jq: <span data-id="' + i + '">' + i + '</span></li>';
        ul.append(li);
    }
}

function jqUpdate(n) {
    var i, el,
    ul = $("#jq-list");
    for (i = 0; i < n; i += 1) {
        el = ul.find('span[data-id="' + i + '"]');
        el.html(el.html() + ' ' + i);
    }
}

function KoApp() {
    var self = this;
    self.items = ko.observableArray([]);
    self.fill = function (n, callback) {
        var i,
        items = self.items();
        for (i = 0; i < n; i += 1) {
            items.push({
                val: ko.observable(i)
            });
        }
        self.items.valueHasMutated();
        setTimeout(function () {
            callback();
        }, 0);
    };
    self.update = function (n, callback) {
        var i;
        ko.utils.arrayForEach(self.items(), function (item) {
            item.val(item.val() + ' ' + item.val());
        });
        setTimeout(function () {
            callback();
        }, 0);
    };
    self.clear = function (callback) {
        self.items([]);
        setTimeout(function () {
     ...