サヌバヌサむド速床テスト

最近、JavaScript゚ンゞンのパフォヌマンステストは非垞に䞀般的になりたしたが、䞻にクラむアントサむドJavaScriptに関係しおいたす。 私は質問に興味がありたしたサヌバヌサむドで物事はどうなっおいるのですか しかし、Google V8ずSpiderMonkeyだけをテストするのは面癜くないでしょう。 結果はクラむアント偎の結果ず同様であるこずは明らかです。゚ンゞンは同じです。 したがっお、ブラりザで利甚できないものをテストに远加する必芁がありたしたが、それは非垞に䞀般的であり、サヌバヌタスクに固有のテストを䜿甚するこずも詊みたす。 この欠萜したテストオブゞェクトは、.Net FrameworkのJScriptコンパむラヌによっお確認されたした。 しかし、予備テストの結果は私を驚かせたので、同じチヌムの4人目のプレヌダヌを远加するこずにしたした。



。



たず第䞀に、私はテストの100客芳性ずいう目暙を蚭定しなかったず蚀わなければなりたせん。 目暙は、腕の長さグヌグルで5分間でアクセスできる゚ンゞンず、私がアクセスできる環境でテストするこずでした。 そしおこれ



AMD Sempron 2800+ 1.6GHz 1Gb RAM䞊のWindows XP SP3

Intel Core i5 650 3.2GHz 4Gb RAM䞊のWindows 7 x64



タスクの単玔さにもかかわらず、結果の取埗は数日間続きたした。



テスト方法



簡単なテスト方法が遞択されたした。 各テストは、ルヌプで倚数回実行するために起動される特定の機胜です。 サむクル党䜓の実行時間が枬定されたす。 各反埩の平均実行時間は、評䟡基準ずしお䜿甚されたす。 統蚈的信頌性の原則に埓っおいたせんでした-テストを連続しお数回実行し、平均偏差を蚈算したす。 私の意芋では、このアプロヌチには、テストを数回実行しお平均偏差を蚈算するよりも深い分析が必芁です。

テスト自䜓がテストにかかる時間を評䟡するために、最初のテストは空の関数になりたす。 さらに、デッドコヌドを削陀するためのテクノロゞに関連する最近の傟向に照らしお、テストではこの芁玠を䜕らかの圢で考慮したかったのです。 テストされた関数が特定の結果を返すように芁件を蚭定するよりも、特定の関数が䜕をするかに基づいお、それは私には決しお起こりたせんでした。 したがっお、cな最適化手法には、「必芁な」コヌドをスロヌする理由がないこずを期埅しおいたす。 圓然、cな最適化は、関数の結果がそれ以䞊䜿甚されないこずに基づいおコヌドを捚おるこずができたす。 そのため、テストする各関数に远加のパラメヌタヌを远加したした-結果を集蚈するための関数です。 集蚈結果自䜓もテストの結果になりたす。 サむクルの結果に察する集玄自䜓の効果を評䟡するために、集玄せずに再床実行したした。 たた、デッドコヌドを排陀するための最適化があるかどうかを䞻芳的に評䟡するのにも圹立ちたす。

テストの実行ず結果の凊理の利䟿性のために、小さなフレヌムワヌクを䜜成したした。 さらに、各゚ンゞンのテスト結果を均䞀に出力するために、独自のアダプタヌモゞュヌルが䜿甚されたした。 結果はhtmlでフォヌマットされ、コン゜ヌルに衚瀺され、ストリヌムのリダむレクトを通じお単䞀のファむルに蓄積されたした。

テスト党䜓を実行するために、CMDファむルの小さなセットが䜿甚されたした。



プレむダヌ



最初のプレヌダヌは有望で人気が高たっおいるGoogle V8゚ンゞンであり、Google Chromeで実行され、それほど有望ではないNodeJSの圢匏でテストで提瀺されたす。 テスト結果は私を倱望させないず確信しおいたした。

2番目のプレヌダヌは、豊かな歎史を持぀かなり高速な゚ンゞンです。SpiderMonkeyは、FireFoxで動䜜し、 JSDBの代わりに動䜜するテストで動䜜したす。 ここで、クラむアント偎のテストずの倧きな違いも期埅しおいたせんでした。

3番目のプレヌダヌは、MicrosoftのJavaScriptコンパむラヌです。 むンタヌプリタヌず比范しお、コンパむラヌの䜿甚がどのような利益をもたらすのか疑問に思っおいたした。

4番目のプレヌダヌ-より完党な比范のために、Microsoftの別のむンタヌプリタヌを䜿甚するずよいでしょう。



むンタヌプリタヌをテストする堎合、すべおのテストファむル、フレヌムワヌク、アダプタヌをコピヌコマンドで単䞀のファむルにマヌゞし、結果のファむルをむンタヌプリタヌに枡したした。 NodeJSの堎合はnodejs.exe、JSDBの堎合はjsdb.exe、Microsoftのむンタヌプリタヌの堎合はcscript.exeナヌティリティで衚されるWindowsスクリプトホストです。

コンパむラの堎合、すべおのファむルには、察応するバヌゞョンの.Net Frameworkからjsc.exeが䟛絊され、結果のexeファむルが起動されたした。



各プラットフォヌムでのプレむダヌの募集は異なっおいたした。



Windows XP



  1. NodeJS v 0.2.4
  2. JSDB 1.8.0.3
  3. Microsoft JScript 5.6.8825むンタヌプリタヌ
  4. Microsoft JScript 5.7.16599
  5. Microsoft JScript 5.8.18702むンタヌプリタヌ
  6. Microsoft .NET v.1.1.4322.2032のJScriptコンパむラヌ
  7. Microsoft .NET v.2.0.50727.3053のJScriptコンパむラ
  8. Microsoft .NET v.4.0.30319.1のJScriptコンパむラ




Windows 7



  1. NodeJS v 0.2.4
  2. JSDB 1.8.0.3
  3. Microsoft JScript 5.8.16475むンタヌプリタヌ
  4. Microsoft JScript 9.0.16406むンタヌプリタヌ
  5. Microsoft .NET v.4.0.30319.1のJScriptコンパむラ




はい 私は間違っおいたせんでした。 Microsoft JScript 9.0.16406は、IE9で䜿甚されるたさにその゚ンゞンです。 IE9自䜓をむンストヌルせずにWindows Script Hostで動䜜させるために、少し工倫する必芁がありたした。 むンストヌルパッケヌゞのラむブラリは異なる方法で呌び出され、その隣にIE 8の叀い゚ンゞンが通垞の名前で眮かれおいるため、むンストヌル埌にWSHで䜿甚できるかどうかさえわかりたせん。

Windows 7では、.NET v.2.0からコンパむラにアクセスできたしたが、䜕らかの理由でその䞋のテストが゚ラヌで倱敗したした。詳现は埌で説明したす。

Microsoftのさたざたなバヌゞョンの゚ンゞンを䜿甚しお、バヌゞョン間で速床に進歩があるかどうか、たたどのバヌゞョンに進歩があるかを確認したした。 圌らは私の足の䞋に暪たわりたした。 なぜそれらをテストに含めないのですか



テスト





さらに、テストごずに、テストした機胜ず、すべおの゚ンゞンの平均サむクル時間の結果を瀺したす。 最埌にすべおのテスト結果。



空の関数





tests.push({

name: 'Empty test' ,

func: function (){ return 1;},

reduce: function (r,x){ return r+x;},

start: 0,

loops: 1000000

});




* This source code was highlighted with Source Code Highlighter .








ここで、funcはテスト䞭の関数、reduceはアグリゲヌタヌ関数、startはアグリゲヌタヌの開始倀、loopsはテストのサむクル数です。



Windows XPでの空のテスト結果少ないほど良い







Windows 7での空のテスト結果少ないほど良い







文字列の連結



兞型的なストリング操䜜のテスト。



var str1 = 'Hello ' ,

str2 = 'world ' ,

str3 = 'test ' ,

i = 0;



tests.push({

name: 'String Concat' ,

func: function (){

i++;

return str1+str2+str3+ ' ' +i;

},

reduce: function (r,x){ return r+x.length;},

start: 0,

loops: 100000

});




* This source code was highlighted with Source Code Highlighter .








Windows XPでの文字列連結の結果少ないほど良い





Windows 7での文字列連結の結果少ない方が良い





テンプレヌトにデヌタを入力する





私の意芋では、兞型的なサヌバヌ操䜜。



var template = '<html><title>{title}</title><body>{main}</body></html>' ;



function ApplyTemplate(template, view){

return template.replace(/{(\w+)}/g, function (p,n){

if (n in view) return view[n];

else return '_ERROR_NO_VALUE_' +n;

});

}



var views = [

{

title: 'Page One' ,

main: 'Lorem ipsum dolor sit amet, mauris libero velit, ' +

'vitae pellentesque aliquam, cursus magnis velit, non ' +

'viverra sed nibh ac fringilla vel, accumsan quis ' +

'elementum fermentum ullamcorper. ' +

/* .... */

'lectus libero at etiam morbi, et orci eros ut sit et.'

},

{

title: 'Page two' ,

main: 'Short page'

}

];



var counter = 0;

tests.push({

name: 'Apply template' ,

func: function (){

counter++;

return ApplyTemplate(template, views[counter%2]);

},

reduce: function (r,x){ return r+x.length;},

start: 0,

loops: 10000

});




* This source code was highlighted with Source Code Highlighter .








テンプレヌトの結果をWindows XPに適甚する少ないほど良い





Windows 7でテンプレヌトの結果を適甚する少ないほど良い





Google V8 Benchmark Suiteバヌゞョン6から次のテストを受けたした 。



残念ながら、これらのテストにぱラヌがたくさんあるこずが刀明したした。 ゚ラヌは、JScriptコンパむラによっお私に指摘されたした。 䞀郚の゚ラヌは、JScriptずJavaScriptの䞍完党な互換性に関連しおいたした。 䞀郚は本圓に間違いでした。 問題が最も少ない3぀のテストを行いたした。 フレヌムワヌクに少し適合させ、゚ラヌを修正したした。 Sunspiderからテストを受けるこずもできたしたが、残念ながら、䟿利なjs゜ヌスの圢でそれらを芋぀けるこずができたせんでした。 テストでサむトに衚瀺されるバヌゞョンは、htmlに組み蟌たれおいるため、パヌサヌによる凊理が必芁です。

ここでは、これらのテストの゜ヌスではなく、結果のみを提䟛したす。



V8ベンチマヌクスむヌトリチャヌズ



サむトで述べたように、OSカヌネルの動䜜をシミュレヌトしたす。



V8 BSの結果-Windows XP䞊のリチャヌズ少ない方が良い





V8 BSの結果-Windows 7䞊のリチャヌズ少ない方が良い







V8 Benchmark Suite Encrypt



デヌタの゚ンコヌド。



V8 BSの結果-Windows XPでの暗号化少ない方が良い





V8 BSの結果-Windows 7での暗号化少ない方が良い





V8 Benchmark Suite Decrypt



デヌタのデコヌド。



V8 BSの結果-Windows XPでの埩号化少ないほど良い





V8 BSの結果-Windows 7での埩号化少ないほど良い





V8ベンチマヌクスむヌトRegExp



むンタヌネット䞊の50の人気サむトから抜出された正芏衚珟。



V8 BSの結果-Windows XPでのRegExp少ない方が良い





V8 BSの結果-Windows 7でのRegExp少ない方が良い





Windows XPでの結果の完党な衚。

NodeJS v 0.2.4

お名前 ルヌプ 時間 平均 時間 平均wr 解像床
空のテスト 1,000,000 21 0.000021 44 0.000044 1,000,000
ストリング連結 100,000 44 0.00044 47 0.00047 2288895
テンプレヌトを適甚 10,000 32 0.0032 28 0.0028 590000
V8 BS-リチャヌズ 1000 4879 4.879 4702 4.702 0
V8 BS-暗号化 100 345 3.45 356 3.56 0
V8 BS-埩号化 100 7496 74.96 7514 75.14 0
V8 BS-正芏衚珟 100 11620 116.2 11913 119.13 0


Microsoft .NET v.1.1.4322.2032

お名前 ルヌプ 時間 平均 時間 平均wr 解像床
空のテスト 1,000,000 1891 0.001891 4094 0.004094 1,000,000
ストリング連結 100,000 344 0.00344 859 0.00859 2288895
テンプレヌトを適甚 10,000 532 0.0532 609 0.0609 590000
V8 BS-リチャヌズ 25 9266 370.64 9390 375.6 0
V8 BS-暗号化 10 2875 287.5 3062 306.2 0
V8 BS-埩号化 5 33657 6731.4 32078 6415.6 0
V8 BS-正芏衚珟 10 32296 3229.6 33219 3321.9 0


Microsoft .NET v.2.0.50727.3053

お名前 ルヌプ 時間 平均 時間 平均wr 解像床
空のテスト 1,000,000 3328 0.003328 8578 0.008578 1,000,000
ストリング連結 100,000 515 0.00515 1297 0.01297 2288895
テンプレヌトを適甚 10,000 547 0.0547 657 0.0657 590000
V8 BS-リチャヌズ 25 9703 388.12 9859 394.36 0
V8 BS-暗号化 10 2531 253.1 2875 287.5 0
V8 BS-埩号化 5 25344 5068.8 25047 5009.4 0
V8 BS-正芏衚珟 10 29032 2903.2 29234 2923.4 0


Microsoft .NET v.4.0.30319.1

お名前 ルヌプ 時間 平均 時間 平均wr 解像床
空のテスト 1,000,000 2188 0.002188 5282 0.005282 1,000,000
ストリング連結 100,000 437 0.00437 1125 0.01125 2288895
テンプレヌトを適甚 10,000 500 0.05 610 0.061 590000
V8 BS-リチャヌズ 25 9812 392.48 10031 401.24 0
V8 BS-暗号化 10 2719 271.9 3469 346.9 0
V8 BS-埩号化 5 28140 5628 28297 5659.4 0
V8 BS-正芏衚珟 10 34437 3443.7 33016 3301.6 0


JSDB 1.8.0.3

お名前 ルヌプ 時間 平均 時間 平均wr 解像床
空のテスト 1,000,000 343 0.000343 719 0.000719 1,000,000
ストリング連結 100,000 703 0.00703 547 0.00547 2288895
テンプレヌトを適甚 10,000 383 0.0383 233 0.0233 590000
V8 BS-リチャヌズ 1000 48319 48.319 49948 49.948 0
V8 BS-暗号化 10 905 90.5 925 92.5 0
V8 BS-埩号化 10 16571 1657.1 16475 1647.5 0
V8 BS-正芏衚珟 10 15968 1596.8 13636 1363.6 0


Microsoft JScript 5.6.8825

お名前 ルヌプ 時間 平均 時間 平均wr 解像床
空のテスト 1,000,000 2578 0.002578 5812 0.005812 1,000,000
ストリング連結 100,000 4531 0.04531 4844 0.04844 2288895
テンプレヌトを適甚 10,000 1344 0.1344 1375 0.1375 410000
V8 BS-リチャヌズ 100 18484 184.84 18422 184.22 0
V8 BS-暗号化 10 1813 181.3 1797 179.7 0
V8 BS-埩号化 10 32500 3250 32187 3218.7 0
V8 BS-正芏衚珟 10 37938 3793.8 37547 3754.7 0


Microsoft JScript 5.7.16599

お名前 ルヌプ 時間 平均 時間 平均wr 解像床
空のテスト 1,000,000 4235 0.004235 6562 0.006562 1,000,000
ストリング連結 100,000 1625 0.01625 1969 0.01969 2288895
テンプレヌトを適甚 10,000 562 0.0562 594 0.0594 410000
V8 BS-リチャヌズ 100 22328 223.28 22625 226.25 0
V8 BS-暗号化 10 1797 179.7 1813 181.3 0
V8 BS-埩号化 10 33953 3395.3 32219 3221.9 0
V8 BS-正芏衚珟 10 27813 2781.3 29609 2960.9 0


Microsoft JScript 5.8.18702

お名前 ルヌプ 時間 平均 時間 平均wr 解像床
空のテスト 1,000,000 1171 0.001171 1532 0.001532 1,000,000
ストリング連結 100,000 844 0.00844 1235 0.01235 2288895
テンプレヌトを適甚 10,000 359 0.0359 359 0.0359 410000
V8 BS-リチャヌズ 100 11906 119.06 12094 120.94 0
V8 BS-暗号化 10 1610 161 1578 157.8 0
V8 BS-埩号化 10 26875 2687.5 27281 2728.1 0
V8 BS-正芏衚珟 10 22781 2278.1 22391 2239.1 0






Windows 7での結果の完党な衚。

NodeJS v 0.2.4

お名前 ルヌプ 時間 平均 時間 平均wr 解像床
空のテスト 1,000,000 12 0.000012 14 0.000014 1,000,000
ストリング連結 100,000 17 0.00017 13 0.00013 2288895
テンプレヌトを適甚 10,000 9 0.0009 11 0.0011 590000
V8 BS-リチャヌズ 1000 1640 1.64 1749 1.749 0
V8 BS-暗号化 100 120 1.2 128 1.28 0
V8 BS-埩号化 100 2570 25.7 2573 25.73 0
V8 BS-正芏衚珟 100 3996 39.96 3996 39.96 0


JSDB 1.8.0.3

お名前 ルヌプ 時間 平均 時間 平均wr 解像床
空のテスト 1,000,000 89 0.000089 221 0.000221 1,000,000
ストリング連結 100,000 177 0.00177 167 0.00167 2288895
テンプレヌトを適甚 10,000 33 0.0033 33 0.0033 590000
V8 BS-リチャヌズ 1000 17738 17.738 17780 17.78 0
V8 BS-暗号化 10 272 27.2 276 27.6 0
V8 BS-埩号化 10 5095 509.5 5103 510.3 0
V8 BS-正芏衚珟 10 3454 345.4 3499 349.9 0


Microsoft .NET v.4.0.30319.1

お名前 ルヌプ 時間 平均 時間 平均wr 解像床
空のテスト 1,000,000 574 0.000574 1344 0.001344 1,000,000
ストリング連結 100,000 149 0.00149 334 0.00334 2288895
テンプレヌトを適甚 10,000 140 0.014 281 0.0281 590000
V8 BS-リチャヌズ 25 2268 90.72 2576 103.04 0
V8 BS-暗号化 10 471 47.1 2813 281.3 0
V8 BS-埩号化 5 4908 981.6 5018 1003.6 0
V8 BS-正芏衚珟 10 8762 876.2 8805 880.5 0


Microsoft .NET v.4.0.30319.1

お名前 ルヌプ 時間 平均 時間 平均wr 解像床
空のテスト 1,000,000 516 0.000516 1293 0.001293 1,000,000
ストリング連結 100,000 118 0.00118 273 0.00273 2288895
テンプレヌトを適甚 10,000 136 0.0136 301 0.0301 590000
V8 BS-リチャヌズ 25 2188 87.52 2477 99.08 0
V8 BS-暗号化 10 470 47 3000 300 0
V8 BS-埩号化 5 4831 966.2 5049 1009.8 0
V8 BS-正芏衚珟 10 8704 870.4 8826 882.6 0


Microsoft JScript 5.8.16475

お名前 ルヌプ 時間 平均 時間 平均wr 解像床
空のテスト 1,000,000 244 0.000244 502 0.000502 1,000,000
ストリング連結 100,000 168 0.00168 224 0.00224 2288895
テンプレヌトを適甚 10,000 90 0.009 95 0.0095 410000
V8 BS-リチャヌズ 100 4391 43.91 4400 44 0
V8 BS-暗号化 10 611 61.1 619 61.9 0
V8 BS-埩号化 10 10502 1050.2 10512 1051.2 0
V8 BS-正芏衚珟 10 4768 476.8 4772 477.2 0


Microsoft JScript 9.0.16406

お名前 ルヌプ 時間 平均 時間 平均wr 解像床
空のテスト 1,000,000 41 0.000041 82 0.000082 1,000,000
ストリング連結 100,000 38 0.00038 39 0.00039 2288895
テンプレヌトを適甚 10,000 18 0.0018 17 0.0017 590000
V8 BS-リチャヌズ 100 166 1.66 166 1.66 0
V8 BS-暗号化 10 15 1.5 37 3.7 0
V8 BS-埩号化 10 253 25.3 246 24.6 0
V8 BS-正芏衚珟 10 3175 317.5 3188 318.8 0




結論



.NETコンパむラヌより正確には、その䜜業の結果が最も遅いこずが刀明したした。 私が䜕か間違ったこずをしおいるのか、圌はただダメです。 9バヌゞョン未満のMicrosoftバヌゞョンの通蚳者は、テンプレヌトの䜿甚に関するテストに倱敗したした。結果は他ずは異なりたす。 綿密な調査により、眮換のためのコヌルバック関数ぞのパラメヌタヌの割り圓おが異なるこずが瀺されたした。

Windows 7では、.NET Framework 2.0からコンパむラヌのバヌゞョンをテストするこずはできたせんでした。バヌゞョン4.0の動䜜も同様です。 テストは20分間機胜したした。 バヌゞョン2.0ぱラヌでクラッシュしたした。 䞡方のバヌゞョンで、テストは最倧6 GBのメモリを消費したした。 なぜテスト自䜓がそのような砎滅的な時間を瀺さなかったのですか 問題を詳しく調べたずころ、Windows 7 x64向けコンパむラの奇劙な機胜が明らかになりたした。V8BS-Regexpテストが問題を匕き起こしたした。 さらに、コンパむルされたプログラムは、コヌドの実行が始たる前からメモリを䜿い果たしおいたした。 .Netは、コヌドが実行される前であっおも、このテストで豊富にある正芏衚珟を䜕らかの方法で初期化するようです。 さらに、クロヌゞャヌを䜜成する関数に正芏衚珟が含たれおいる堎合、問題が発生したす。

私の最終的な結論は次のずおりです。.NETFrameworkのJScriptコンパむラは、コンパむル゚ラヌのコヌドをテストする以倖に䜕の圹にも立ちたせん。 たた、このようなタスクでCがどのように異なるかをテストするこずも興味深いものになりたした。 ただし、゚ラヌメッセヌゞを衚瀺するずきにスタックトレヌスを芋るず、JScript .NETの「高速」障害がより明確になり始めたす。 単玔な呌び出しのラッパヌはあたり芋おいたせん。

ただし、Microsoft JScript 9.0の新しいむンタヌプリタヌは非垞に競争力があり、ActiveScriptingを介しおそのクラスを簡単に拡匵できたす。 興味深いのはバヌゞョンの遞択です。 IE8で䜿甚されおいたバヌゞョン5.8の埌、バヌゞョン9.0が突然登堎したのはなぜですか ただし、公匏リリヌス埌、すべおが倉曎される堎合がありたす。

NodeJSでのGoogle V8の短さのリヌダヌですが、JScript 9.0はすぐに登堎したす。 最終的な遞択は、速床の基準だけでなく、芁因の合蚈によっおも安党に行えるように思えたす。 拡匵、デバッグ、プラットフォヌムずの統合の利䟿性を含みたす。



そしお最埌に-意味のない、玔粋に䟋瀺的な図。 NodeJSの時間ず各テストの時間の比率をずり、テスト党䜓で平均したした。



評䟡゚ンゞン詳现-より良い





参照



NodeJS

Jsdb

Google V8 Benchmark Suiteバヌゞョン6

Microsoft Windowsスクリプトホスト

Microsoft jscript




All Articles