まったく役に立たないテストNo. 1:PHPとGroovy

最近、 Grailsフレームワークのテンプレートテストを比較するように依頼されました。 このようなテストが必要な理由と、実際にアプリケーションのパフォーマンスについて彼らが言うこと-私は知りません。 しかし、それは楽しく、人々は本当にそのようなテストが好きです。

実際、Grailsにはテンプレートエンジンはありませんが、サーバーページ(GSP-Groovy Server Pages)内で使用できるGroovy言語があります。 そこで、Groovy言語のパフォーマンスを測定したいと思います。 基本言語はPHPです。

なぜなら ロードモードでの本格的なテストには実稼働サーバーが必要です。このテストは大幅に簡素化され、コンテナーなしで実行されます。

装備品

ゴミ箱サーバーIBM 325、Intel®Pentium-4 2.40GHz、1GB RAM。

テストプログラム

コードの観点から見たWebアプリケーションのスタッフィングの95%は、サイクル、オブジェクトの作成、オブジェクトのフィールドへのアクセスで構成されています。 これらの理由により、コンソールモードで動作する2つの単純なプログラムが作成されています。

(重要な部分はページコンテンツの出力でもあり、これらのテストでは考慮されていません-これにはコンテナでの完全なテストが必要です)

Test.php
 <?php class My { public $x; public $y; public $z; } $t1 = gettimeofday(true); $arr = array(); for($i = 0; $i < 100; $i++) { $entry = new My(); $entry->x = 'A'; $entry->y = 'B'; $entry->z = 'C'; array_push($arr, $entry); } $iterations = (int) $argv[1]; print $iterations." iterations.\n"; for($i = 0; $i < $iterations; $i++) { $x = null; foreach($arr as $entry) { $x = $entry->x.$entry->y.$entry->z; } } print "\n".(gettimeofday(true) - $t1)." sec.\n"; ?> 


Test.groovy
 class My { def x, y, z; } def t = System.currentTimeMillis() arr = [] for(def i = 0; i < 100; i++) { def entry = new My(x:'A',y:'B',z:'C') arr << entry } def iterations = args[0] as int; println "Using ${iterations} iterations."; for(def k = 0; k < iterations; k++) { def x = null for(def entry : arr) { x = entry.x + entry.y + entry.z } } println "${(System.currentTimeMillis() - t) / 1000.0} sec."; 


ソフトウェア

PHP 5.2.6(cli)(ビルド:2008年5月8日08:38:47)
Groovyバージョン:1.6.3 JVM:Java HotSpot(TM)Server VM(ビルド14.0-b16、混合モード)

結果

反復回数Test.php、秒Test.groovy、秒
10.0001.382.07
20,0002.773.15
30,0004.24.3
50,0006.96.5
100,00013.812.1
300,0004134
500,0006857
1,000,000136111

結論

Groovyプログラムのパフォーマンスは、反復回数が増えると大幅に向上します。 これは、HotSpotコンパイラの動作が原因である可能性が最も高いです。

別のポイント-PHPアクセラレーターを試すことができます。 これに基づいて、Zendを試しましたが、特に影響はありませんでした。 xyzフィールドのアクセス許可修飾子を無効にすると、PHPスクリプトが高速化されたことは面白いです。

Source: https://habr.com/ru/post/J72479/


All Articles