Насколько Node.js быстрее, чем Windows Script Host? И о чём это говорит нам?

в 7:27, , рубрики: javascript, jit, microsoft, node.js, nodejs, php, бенчмаркинг, метки: , , , , ,

[цитата]Читатель, заходящий на сайт NodeJS.org, по центру страницы видит четыре цитаты от лидеров сайтостроения, выражающие удовольствие от Node. Цитаты меняются каждую минуту. При некотором везении (или терпении при перезагрузке страницы) читатель увидит похвалу от Клаудио Кальдато из Microsoft Open Technologies, Inc. — для вашего удобства я привожу эту цитату на иллюстрации справа.

Чем вызвана к жизни такая похвала? Ведь, казалось бы, задолго до того, как движок Node вообще успел появился на свет, у Microsoft существовало собственное (встроенное в Windows, начиная с Windows 98, а также устанавливаемое вместе с Internet Explorer 5) средство для запуска скриптов — Windows Script Host.

Ответ очевиден: Node.js работает гораздо быстрее. (У него, кстати, ещё и API попроще. Но главное — скорость.)

Но насколько именно быстрее Node, чем WSH?

Это нетрудно выяснить опытным путём. Возьмём тот скрипт, при помощи которого evgeniyup вчера сравнивал быстродействие WSH с быстродействием виртуальной машины своего языка ObjectScript. В начале скрипта добавим десяток строк — «костыль» для Node.js, реализующий WSH-функцию WScript.Echo при её отсутствии.

показать (или вновь скрыть) исходный код скрипта

// CScript to Node.js:
if (typeof WScript == "undefined") WScript = {};
if (typeof WScript.Echo == "undefined") WScript.Echo = function(){
  var i;
  var log = '';
  for (i=0; i < arguments.length; i++){
     log += arguments[i];
  }
  console.log(log);
}

var fannkuch = function(n)
{
  var p = [], q = [], s = [], sign = 1, maxflips = 0, sum = 0;
  var i;
  for(i=1; i<=n; i++) p[i] = q[i] = s[i] = i;
  for(;;){
    // Copy and flip.
    var q1 = p[1];				// Cache 1st element.
    if(q1 != 1){
      for(i=2; i<=n; i++) q[i] = p[i];		// Work on a copy.
      var flips = 1;
      for(;;){
        var qq = q[q1];
        if(qq == 1){				// ... until 1st element is 1.
          sum = sum + sign*flips;
          if(flips > maxflips){
            maxflips = flips;
          } // New maximum?
          break;
        }
        q[q1] = q1;
        if(q1 >= 4){
          var i = 2, j = q1 - 1
          for(;;){ var tmp = q[i]; q[i] = q[j]; q[j] = tmp; if(++i >= --j) break; }
        }
        q1 = qq; flips++;
      }
    }
    // Permute.
    if(sign == 1){
      var tmp = p[2]; p[2] = p[1]; p[1] = tmp; sign = -1;	// Rotate 1<-2.
    }else{
      var tmp = p[2]; p[2] = p[3]; p[3] = tmp; sign = 1;	// Rotate 1<-2 and 1<-2<-3.
      for(i = 3;; i++){
        // print "mark 4"
        var sx = s[i];
        if(sx != 1){ s[i] = sx-1; break; }
        if(i == n) return [sum, maxflips];	// Out of permutations.
        s[i] = i;
        // Rotate 1<-...<-i+1.
        var t = p[1]; for(var j = 1; j <= i; j++){ p[j] = p[j+1]; } p[i+1] = t;
      }
    }
  }
}

function getTimeSec(){
 	var d = new Date();
    return (d.getTime() + d.getMilliseconds() / 1000.0) / 1000.0;
}

var n = 10;
var start_time = getTimeSec();
var r = fannkuch(n);
var sum = r[0], flips = r[1];
WScript.Echo(
    sum,"n",
    "Pfannkuchen(",n,") = ",flips,"n",
    "time = ",(getTimeSec() - start_time),"n"
)

После этого достаточно запустить этот скрипт дважды (сперва в Node, затем в WSH) — и мы получим вот какой результат в консоли (и на скриншоте):

[скриншот]

Разница на два порядка! Вычисления, с которыми Node.js справляется за секунду, Windows Script Host перемалывал больше двух минут.

Измерение я произвёл в Windows XP SP3 на процессоре Pentium 4 (2,2 ГГц). Каждый из вас может самостоятельно повторить его у себя по вышеописанной методике.

Вывод также довольно прост и доступен каждому: с появлением движка V8 язык JavaScript, можно сказать, пережил второе рождение. Его вычислительные возможности возросли стократно, хотя правила языка не изменились ни на йоту (если не считать появления некоторых необязательных новинок из черновика стандарта «ECMAScript Harmony»).

В реальном мире с людьми такое случается только в комиксах про супергероев. А в программировании запросто случается и наявý: разработчик программировал на джаваскрипте, затем появился V8 — бабах, и все скрипты стали работать в сто раз быстрее.

И это должно давать повод для дальнейшего глубочайшего раздумья над перспективами. Вот, например: evgeniyup вчера измерил, что PHP 5.3.3 не слишком-то быстрее работает, чем WSH. Где-то в 1,2 раза. Стало быть, и в этой области должен быть некоторый потенциал для резкого наращивания скорости методом JIT-компиляции и другими V8-подобными трюками, тогда как до сих пор все так называемые ускорители PHP занимались, в лучшем случае, кэшированием байт-кода и попытками его оптизимации, но не более. Вообразите, как переменится окружающий нас мир WWW, если PHP станет исполняться в сто раз быстрее.

Или хотя бы на порядок быстрее.

Автор: Mithgol

Поделиться

* - обязательные к заполнению поля