Search
Write a publication
Pull to refresh

Comments 39

Если
p[i], q[i], s[i] = i, i, i
еще можно понять, то как понять
p[2], p[1] = p[1], p[2] sign = -1
?
Свап элементов и sign = -1.
Без разделения кажется, что p[2] как-то взаимодействует с sign, а потом им присваивается -1.
Видимо просто говнокод
Это одна из «сахарных фич» OS, насколько я понял. Возникает ощущение, что сепаратором может быть все что угодно, а главное когда угодно. Взрыв мозга, мля.
Интересно, а как потом поддерживать такой код, да еще чужой, в котором десять переменных слева и десять справа? Если пара слева, да пара справа, и выражение не очень длинное, его легко охватить взглядом и понять, что к чему. А ведь всегда находятся те, кто использует синтаксический сахар во зло :)
cscript очень неудачный выбор.
лучше на node.js глянуть.
cscript это wsh что ли? Мать моя женщина…
$ cat /proc/cpuinfo
>> Intel(R) Xeon(R) CPU L5520 @ 2.27GHz

$ node -v
>> v0.8.10

$ node fannkuch.js
73196
Pfannkuchen( 10 ) =  38
time =  0.682682991027832
Без сравнения толку от этих цифр нет.
Без сравнение чего? код то же.
О чём говорят вышеуказанные цифры?
О том что код на js быстрее чем код на os?
О том что node.js быстрее чем cscript?
О том что серверный процессор быстрее десктопного?
Цифры сами по себе не говорят ни о чём.
Но ведь автор статьи меряется именно цифрами, нет? А тест на ноде ставит его на место.
Различается платформа и окружение, так что говорить об идентичности результатов нельзя.
Если бы сравнили в одной и той же ОСи, на одном и том же компьютере этот OS и node.js, тогда да, можно было бы о чём-то говорить, а так — это пустые цифры, не привязанные к контексту.
Это замечание справедливо.

Повторяю опыт у себя с использованием следующего кода:

// 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"
)

Итог тестирования (скриншот):

[скриншот]

Операционная система Windows XP SP3, процессор Pentium 4 (2,2 ГГц).

Цифры говорят о том, что Node.js примерно на два порядка (десятичных!) быстрее, чем WSH.
Как-то это все мутновато. Как тут может быть один язык быстрее другого? Сравниваться по скорости могут реализации языков, а тут взяли первые попавшиеся реализации языков и сразу победили. Почище надо эксперименты проводить…
На моей системе php выполнялся около 31 секунды, а OS вообще не выполнился.
Заголовок ну очень громкий, хотя говорить о том, что один язык быстрее другого — я считаю, вообще моветон. На деле — один тест, и почему-то, как верно показали, Cscript как движок для JS, хотя естественно, все бы сравнивали с V8.
Правильно, а на ассемблере можно написать код, для решения той же задачи, который будет работать как в несколько раз быстрее, так и в несколько раз медленнее.
Что такого в семантике этого языка, что код на нем работает быстрее? Если в семантике особенностей нет, то остается только особенность реализации. Потом окажется, после нескольких лет жизни, что после фикса всех багов и дыр в безопасности, он и ничуть не быстрее остальных.
Согласен про ассемблер. Если задействовать регистры напрямую будет быстрее, чем в любых других языках.
Уважаемые авторы, для встраиваемого языка программирования «скорость на 60% в синтетических тестах быстрее чем JavaScript» — если не последний, то один из последних выборов критерия.
тьфу ты, утро…
*критериев выбора.
Засунул я Ваш код в консоль фаербага (заменив WScript.Echo на console.log):

73196
Pfannkuchen( 10 ) = 38
time = 1.5295288562774658 

Судя по рейтингу поста, упоминание о «меньшей скорости PHP» было воспринято, как «оскорбление чувств верующих». Советую просто не упоминать в заголовках топиков и все будет ок.

А вообще автору огромный респект! Будем надеятся, что OS займет свою нишу.
Я думаю основная часть минусов за не самое адекватное сравнение. Я не уверен, но подозреваю, что PHP правильнее измерять на *nix. А в качестве движка для JS однозначно нужно было взять V8 (ну и Rhino заодно). Ценность этого топика близка к нулю — синтаксис языка не совсем ясен, а производительность в попугаях.
Почитайте первый пост про синтаксис. Ценность этого топика в том, что OS как минимум не медленнее вышеприведенных языков, или хотя бы на уровне с ними.
Ценность этого топика в том, что OS как минимум не медленнее вышеприведенных языков, или хотя бы на уровне с ними.
Обратите внимание на v8. Вы уверены про «на уровне в ними»? И почему то нет сравнения с lua? Мне кажется это логичнее, чем с PHP.
С рейтингом было все предсказуемо, цель поста была в другом, она достигнута. С node сравнивать бессмысленно, т.к. это JIT.
«Я придумал велосипед! О чудо, он едет!»
Node.js намного быстрее php. Это выяснялось уже во множестве тестов. То что вы используете Cscript это очень странно. Но глядя на разрыв между php и node.js, не думаю что ObjectScript такой быстрый.
php ./test.php 10
n: 10
73196
Pfannkuchen(10) = 38
time = 68.549677848816

node test.js
73196
Pfannkuchen(10) = 38
time = 0.6416420936584473
faiwer@faiwer-desktop:~/temp/test$ time php test.php 10
n: 10
73196
Pfannkuchen(10) = 38
time = 107.46600389481

real	1m47.501s
user	1m47.283s
sys	0m0.060s


faiwer@faiwer-desktop:~/temp/test$ time node test.js 10
73196
Pfannkuchen(10) = 38
time = 0.7647650241851807


real	0m0.856s
user	0m0.844s
sys	0m0.012s


Как то уж слишком быстро, может быть они не идентичны?
Разумеется, node не имеет VM и не исполняет байткод, это JIT на движке V8 — одной из лучших разработок от google. Да и вообще компания google — одна из самых уважаемых компаний в моем личном рейтинге. Но на практике JS мало используют как встраиваемый язык, особенно на мобильных платформах. В основном все через PhoneGap и т.п., а там с производительностью JS все очень плохо. А вот OS на мобильнике показал себе очень хорошо.
Хм, тогда возникает вопрос — почему вы сравнили его с PHP? Насколько я понимаю ваш главный конкурент Lua, я не прав? Я знаю, что PHP как то можно встроить, но, полагаю, это настолько редкое явление, что является уделом редких энтузиастов.
PHP один из прародителей языка OS, к тому же они имеют VM и исполняют байткод, могут быть нацелены на одни и те же задачи. Наивно было бы полагать, что за 2 месяца работы над OS (в промежутке между основной работой, семьей, пивом и т.п.) я один переплюну Lua с его 19 летней историей разработки и огромным комьюнити и 18 летней историй PHP. Тем не менее тест проведен.
Когда сие чудо заработает на linux? Очень хочется «потрогать».
На линуксе народ пробует. Некто aperezdc (из иностранного лагеря) закомитил обновление Unix-related fixes and basic interactive interpreter, т.е. в репозитории сейчас есть makefile и main.cpp с командным интерпретатором.
Автору вопрос: как вы думаете, за счёт чего происходит ускорение по сравнению с PHP и JS?
Тот уровень оптимизации, на котором сейчас находится OS — это наносекунды, а это значит, что существенное влияние на производительность оказывает все: лишнее присваивание, лишний вызов функции и т.п. Сейчас уже даже код, которые делает компилятор для инлайновой (inline) функции не достаточен, именно по этой причине Lua сплошь и рядом напичкам дефайнами, а PHP реализует основной код VM в хидере (.h), а не в cpp. Основной код VM в OS исполняется в функции execute. Для достижения максимальной производительности нужно вывернуть все функции, вызываемые из execute, внутрь самой execute, вручную. Обычно при этом удается сделать дополнительные оптимизации. Как следствие этого — большое дублирование кода, либо заворачивание особо частого функционала в дефайны, как поступили в Lua.
Sign up to leave a comment.

Articles