Lua の組み込みテーブルのソートと C/C++/Java/php/ などの組み込みソート アルゴリズムのソート効率の比較。

WBOY
リリース: 2016-06-23 13:44:01
オリジナル
925 人が閲覧しました

Lua のようなスクリプト言語は、ビジネス ロジックを設定ファイルとして処理する場合には便利で問題がありませんが、大量の計算が必要な場合には少し不十分です。Lua の組み込みソート アルゴリズムを比較してください。 C/C++、PHP、Javaなどのクイックソートアルゴリズム。

クイック ソート アルゴリズムはバブル ソートに基づいており、時間計算量は T(n)=O(nLog2n) であることがわかります。

LuaIDE LDT で直接実行する方が、C++ を介して Lua スクリプトをロードして実行するよりもはるかに効率的であることがわかりました。例として 500 万のデータを並べ替えるスクリプトは次のとおりです

同じ並べ替えを実行します。スクリプト Lua インタープリター 組み込みソート アルゴリズムは、C/C++ 組み込み Lua インタープリターを介して呼び出すよりも LDT で 14 倍高速に実行されます

そして、C/C++ クイック ソートの速度は、組み込み Lua よりも 40 倍高速ですソートアルゴリズムでは、LDT での Lua ソートの 3 倍もの効果があり、少なくとも私のコンピュータではこれが見られます。

PHP によって実装されたクイック ソート アルゴリズム

PHP は単にページ キャッシュ プールの容量が小さすぎて、5W のデータ ソートではすでに多すぎます。 。 。 。 。 Lua に比べると効率がかなり劣るので、Web CRUD だけに使いましょう。 。ページメモリプールサイズを設定しても、5000 では 2 秒近くかかります。Java ビッグデータ処理 JVM はスタックオーバーフローを起こしやすいため、効率は同じです。 C/C++ またはそれ以上の JVM は、.NET と同じタイム コンパイル テクノロジであり、小さなコードの実行効率は非常に高いですが、大きなプログラムはそうではありません。

Java プログラミング言語および環境では、ジャストインタイム コンパイラー (JIT コンパイラー、ジャストインタイム コンパイラー) は、Java バイトコード (解釈する必要がある命令を含む) を、プロセッサ向けの命令プログラムの処理に直接送信できます。 Java プログラムを作成する場合、ソース言語ステートメントは、特定のプロセッサ ハードウェア プラットフォーム (たとえば、Intel の Pentium マイクロプロセッサや IBM の System/390 プロセッサ) に対応する命令コードにコンパイルされるのではなく、Java コンパイラによってバイトコードにコンパイルされます。バイトコードは、プラットフォームに依存しないコードであり、任意のプラットフォームに送信して、そのプラットフォーム上で実行できます。

以前は、どの言語で書かれたほとんどのプログラムも、コンピュータ プラットフォームごとに再コンパイルし、場合によっては書き直す必要がありました。 Java の最大の利点の 1 つは、プログラムを一度作成してコンパイルするだけで済むことです。どのプラットフォームでも、Java はコンパイルされたバイトコードを特定のプロセッサが理解できる命令に解釈します。それにもかかわらず、Java 仮想マシンは一度に 1 つのバイトコード命令しか処理できません。特定のシステム プラットフォームで Java ジャストインタイム コンパイラ (実際には 2 番目のコンパイラ) を使用すると、(プログラムが元々そのプラットフォーム用にコンパイルされたものであっても) バイトコードをシステム固有のコードにコンパイルできます。コードが JIT コンパイラーによって (再) コンパイルされると、通常はコンピューター上でより高速に実行されます。


ジャストインタイム コンパイラ (JIT コンパイラ) は仮想マシンに付属しており、オプションで使用できます。バイトコードを、すぐに実行できるプラットフォーム固有の実行可能コードにコンパイルします。 Sun Microsystems は、JIT コンパイラ オプションを選択すると、特に実行可能メソッドが再利用される場合に、通常、プログラムの実行が高速になることを示唆しています


<?php   define('ARRAY_SIZE',5000);      function QuickSort($arr,$low,$high)   {     if($low>$high)	   return ;	 $begin=$low;	 $end=$high ;	 $key=$arr[$begin];     while($begin<$end)	 {	    while($begin<$end&&$arr[$end]>=$key)		   --$end ;		$arr[$begin]=$arr[$end];        while($begin<$end&&$arr[$begin]<=$key)		  ++$begin;		$arr[$end]=$arr[$begin];			 }	  $arr[$begin]=$key;      QuickSort($arr,$low,$begin-1);	  QuickSort($arr,$begin+1,$high);   }   $arr=array();   echo '插入前时间:'.time().'<br/>';   for($i=0;$i<ARRAY_SIZE;$i++)   {     array_push($arr,rand(1,50000));   }   echo '插入后时间:'.time().'<br/>';   echo '排序前时间:'.time().'<br/>';   QuickSort($arr,0,ARRAY_SIZE-1);   echo '排序后时间:'.time().'<br/>';?>
ログイン後にコピー
上記のコードは、LDT 内で直接実行されます。次の結果は、データの並べ替え後 6 秒を示しています。 500 万配列の同じ Lua スクリプトが C++ インタープリターに埋め込まれており、実行効率がひどいです

上記の Lua スクリプトを Lua C++ 経由でロードして実行した後の結果は次のとおりです。 80S では、挿入と並べ替えの速度が遅くなったため、C++ を使用して Lua をロードして同様の操作を行うことは価値がありません。C++ の組み込み解釈を通じて呼び出される速度が非常に遅いことを見てみましょう。 C++PHP JAVA の内部ソートのアルゴリズムの効率。





C/C++ が大量のデータを処理する場合、次のような利点があります。500W のデータ コンテンツをソートするのにかかる時間はわずか 2 秒です。これは、C/C++ の 40 倍の Lua スクリプトを介して実行されます。


print("插入前时间",os.clock())--定义table变量sorTable={}  for i=1,5000000,1 do  sorTable[i]=iendprint('插入数据后时间:',os.clock())print('插入了',#sorTable,'个数据!')print('排序前时间:',os.clock())table.sort(sorTable,function(a,b)  if(a<b) then     return true  else   return false  endend )print("排序后时间:",os.clock())
ログイン後にコピー

C/C++ の場合、実行結果はほぼ 2 秒かかることが想像できるため、Lua などのスクリプト言語の場合、ビッグ データ操作を処理するのは決して賢明な行動ではありません。


Java のクイック ソート アルゴリズムに基づくと、JVM 上で実行される Java の同じクイック ソート アルゴリズムは、実際には 500 万のデータをソートするのに 2 秒もかかりません。 ...


れー

以上













ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート