ObjectScript-PHPおよびJSよりも高速な新しいプログラミング言語

ObjectScriptは、組み込み可能で非常に軽量な新しいオブジェクト指向のオープンソースプログラミング言語です。 ObjectScriptは、JavaScript、Lua、PHPなどの言語の機能を拡張します。 構文は主にJavaScript、Luaからの複数の割り当て、およびPHPからのプロパティの操作から取得されます。



ObjectScript 0.97-vm2は、PHP 5.3.3およびJS よりもそれぞれ34%および61% 高速です。



テスト方法



テストでは、 Fannkuchアルゴリズムが使用されました。 非常に便利なテスト、パラメーター付きの1つの関数、パラメーターが1増加すると、計算回数は約10倍に増加します。 したがって、テストに費やす時間が少ないほど良いです。



Fannkuchは、完全なソースであるObjectScriptに実装されました。



print arg var fannkuch = function(n) { var p, q, s, sign, maxflips, sum = [], [], [], 1, 0, 0 var i for(i=1; i<=n; i++) p[i], q[i], s[i] = i, 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, j = 2, q1 - 1 for(;;){ q[i], q[j] = q[j], q[i]; if(++i >= --j) break } } q1 = qq; flips++ } } // Permute. if(sign == 1){ p[2], p[1] = p[1], p[2] sign = -1 // Rotate 1<-2. }else{ p[2], p[3] = p[3], p[2] 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 } } } } var n = numberof(arg && arg[1]) || 5 var start_time = getTimeSec() var sum, flips = fannkuch(n) echo( sum"\n" "Pfannkuchen("n") = "flips"\n" "time = ", (getTimeSec() - start_time)"\n" )
      
      





PHPでは、完全なソース:



 <?php function fannkuch($n) { $p = array(); $q = array(); $s = array(); $sign = 1; $maxflips = $sum = 0; for($i=1; $i<=$n; $i++) $p[$i] = $q[$i] = $s[$i] = $i; for(;;){ // Copy and flip. $q1 = $p[1]; // Cache 1st element. if($q1 != 1){ for($i=2; $i<=$n; $i++) $q[$i] = $p[$i]; // Work on a copy. $flips = 1; for(;;){ $qq = $q[$q1]; if($qq == 1){ // ... until 1st element is 1. $sum += $sign*$flips; if($flips > $maxflips){ $maxflips = $flips; } // New maximum? break; } $q[$q1] = $q1; if($q1 >= 4){ $i = 2; $j = $q1 - 1; for(;;){ $tmp = $q[$i]; $q[$i] = $q[$j]; $q[$j] = $tmp; if(++$i >= --$j) break; } } $q1 = $qq; $flips++; } } // Permute. if($sign == 1){ $tmp = $p[2]; $p[2] = $p[1]; $p[1] = $tmp; $sign = -1; // Rotate 1<-2. }else{ $tmp = $p[2]; $p[2] = $p[3]; $p[3] = $tmp; $sign = 1; // Rotate 1<-2 and 1<-2<-3. for($i = 3;; $i++){ $sx = $s[$i]; if($sx != 1){ $s[$i] = $sx-1; break; } if($i == $n) return array($sum, $maxflips); // Out of permutations. $s[$i] = $i; // Rotate 1<-...<-i+1. $t = $p[1]; for($j = 1; $j <= $i; $j++){ $p[$j] = $p[$j+1]; } $p[$i+1] = $t; } } } } function getTimeSec(){ list($usec, $sec) = explode(" ",microtime()); return ($usec + $sec); } $n = isset($argv[1]) ? $argv[1] : 5; echo "n: $n\n"; $start_time = getTimeSec(); $r = fannkuch($n); $sum = $r[0]; $flips = $r[1]; echo("$sum\nPfannkuchen($n) = $flips\n" . "time = ".(getTimeSec() - $start_time)."\n");
      
      





JavaScriptでは、完全なソース:



 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 7、CPU Core i7 2630QM 2Ghzプラットフォームで実施されました。 Fannkuchはパラメーター10で開始しました。



ダブル数値型のObjectScript 0.97-vm2リリースビルド(フロートを使用すると約10%高速になりますが、PHPとJSにはダブルダブル数値があり、PHPにも整数型があるため、これらの数値は記事に記載しません):



 c:\Sources\OS\bin\os.exe test_fannkuch.os 10
      
      





出力(示されている時間は10回の繰り返しの平均です):



 73196 Pfannkuchen(10) = 38 time = 20.0991
      
      





PHP 5.3.3:



 c:\WebServers\usr\bin\php5.exe test_fannkuch.php 10
      
      





出力(示されている時間は10回の繰り返しの平均です):



 73196 Pfannkuchen(10) = 38 time = 26.853
      
      





JS(パラメーター10はtest_fannkuch.js内):



 Cscript.exe test_fannkuch.js
      
      





出力(示されている時間は10回の繰り返しの平均です):



 73196 Pfannkuchen( 10 ) = 38 time = 32.3313
      
      





要約データ



時間が短いほど良い。



ObjectScript- 20.099

PHP- 26.853

JS- 32.331



時間20.099を参考にして、結果をパーセンテージで減らします。





ObjectScriptのソースコードとサンプルをこのリンクのこの記事からダウンロードし、 proj.win32 \ examples.slnprofile_benchmarkプロジェクトを開きます。



ObjectScript言語機能



OOP-あり

最初のクラスの値として機能する-は

短絡は

ガベージコレクター-3色インクリメンタルガベージコレクション

バイトコードでのコンパイル-はい

コンパイル済みプログラムのダウンロード-はい

モジュール性-は

実行時にロードされるモジュール-はい

クロスプラットフォーム-は

C / C ++との統合-は

ソース-オープンソース

ライセンス-MIT(すべての製品で無料で使用できます)

JavaScript、Lua、PHPから借用した言語のアイデア

言語の目標と目的:ゲームおよびプログラムロジックのスクリプト作成、クロスポータビリティ、Webおよびサーバー開発

著者-Evgeny Golovin(開発者oxsar.ruなど)

ObjectScript開発時間-2か月



ObjectScriptの開発とプロモーション



さらなる速度最適化の可能性はまだ尽きていませんが、現在の仕様はかなり良く見えます。 どうやらさらに最適化すると、少し遅くなります。 さまざまな言語へのバインディングを研究し、OSへのC ++バインディングを本当に便利にする予定です。



喜んで、私はあなたのために仕事を得て、あなたがOSで必要なAPIをラップします:)



PSプロジェクトには投資が必要であり、協力と重要な事項については、evgeniy.golovin [AT] unitpoint.ruに安全に書き込むことができます。



ObjectScriptに関するその他の関連記事:






All Articles