Lua中table內建排序與C/C++/Java/php/等內排序演算法的排序效率比較

來源:互聯網
上載者:User
Lua這類指令碼語言在處理商務邏輯作為設定檔的時候方便省事 但是在大量需要 運算的地方就顯得略微不足 按照 Lua內建排序演算法 對比C/C++ PHP Java等的快速排序演算法進行一下比較。

快速排序演算法是基於冒泡排序,最佳化而來,時間複雜度T(n)=O(nLog2n) ,可見內部採用了二分策略 。

發現在LuaIDE LDT下直接運行效率要比 通過C++載入運行Lua指令碼效率高的多 拿500W個資料排序 來說 ,指令碼如下

同樣的排序指令碼Lua解譯器的內建排序演算法在LDT下,運行速度比通過C/C++內嵌Lua解譯器調用的快14倍之多

而C/C++的快速排序速度又是Lua 內嵌排序演算法的速度的40倍之多,LDT下的lua排序的3倍之多,起碼在我的電腦上 看到的是這樣的效果。

PHP實現的快速排序演算法

PHP簡直不敢用它做排序,頁面緩衝池容量太小了,5W個資料排序就已經吃不消了。。。。。 效率遠不如Lua 所以還是老老實實的用它做web CRUD吧。。就算配置了 頁面記憶體池大小也無法滿足需求 5000就花費了接近2s

~~~還是附上代碼吧

$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().'
'; for($i=0;$i'; echo '排序前時間:'.time().'
'; QuickSort($arr,0,ARRAY_SIZE-1); echo '排序後時間:'.time().'
';?>



Java實現的快速排序演算法如果不是因為Java大資料處理JVM容易出現棧溢出,那麼效率上和C/C++持平 甚至優於這一點JVM做的很漂亮 據一位大哥說是just in Time Compile技術,和.NET一樣 小段代碼執行效率特別高,大程式就不行了。

Java程式設計語言和環境中,即時編譯器(JIT compiler,just-in-time compiler)是一個把Java的位元組碼(包括需要被解釋的指令的程式)轉換成可以直接發送給處理器(processor)的指令的程式。當你寫好一個Java程式後,源語言的語句將由Java編譯器編譯成位元組碼,而不是編譯成與某個特定的處理器硬體平台對應的指令代碼(比如,Intel的Pentium微處理器或IBM的System/390處理器)。位元組碼是可以發送給任何平台並且能在那個平台上啟動並執行獨立於平台的代碼。 
  過去,大多數用任何語言寫的程式在每個電腦平台上都必須重編譯,甚至有時需要重寫。Java最大的優點之一就是你只需要寫和編譯一次程式。在任何平台上,Java都會將編譯好的位元組碼解釋成能被特定的處理器所理解的指令。儘管如此,Java虛擬機器一次只能處理一條位元組碼指令。在特定的系統平台上使用Java即時編譯器(實際上是第二個編譯器)能把位元組碼編譯成特定系統的代碼(雖然這個程式最初已經在這個平台上被編譯過)。一旦代碼被JIT編譯器(重)編譯後,它在電腦上通常就會運行地更快。
  
  即時編譯器(JIT compiler)隨虛擬機器一起供給的,並可選使用。它把位元組碼編譯成可立即執行的指定平台的可執行代碼。Sun微系統建議,選擇JIT編譯器選項通常會使程式運行地更快,尤其是當某個可執行檔方法被重複使用時

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  
如上代碼在 LDT內直接運行 如下結果 顯示6s排序完 500W個數組的資料,但是同樣的 Lua指令碼內嵌到C++解譯器解釋執行效率缺可怕的要命


通過Lua C++載入上述Lua指令碼運行之後結果如下,缺花了80S多,插入和排序的速度都變慢了 所以 利用C++載入Lua 做類似操作 是得不償失的同樣的Lua指令碼通過 C++內嵌解釋調用速度變得如此之慢,下面再看看C++PHP JAVA中內排序演算法的效率。


對於C/C++處理大批量資料,那絕對是優勢,下面是使用 快速排序演算法 實現 500W資料內容排序,僅僅花了2s的時間是LDT下的三倍 ,是通過C/C++載入Lua指令碼的40倍之多。

#include "stdafx.h"#include "time.h"#include "stdlib.h"#include "stdio.h"#define ARRSIZE 5000000//快速排序  //以key為基準 進行遞迴排序 思路來源於  冒泡排序演算法///把資料一分為二  key的兩邊分別是 大於key  小於key的資料 進行遞迴從而進行排序//時間複雜度是 nlog2nvoid QuickSort(int arr[],int low,int high){if(low>=high)return ;int begin=low ; //記錄當前調用的起點indexint end=high  ; //記錄當前的終點indexint key=arr[begin]; //以此為軸進行劃分 while(begin=key)  //從右邊尋找一個小 值end--;arr[begin]=arr[end];while(begin

運行結果可想而知,對於C/C++來說 耗費時間幾乎為2s ,所以對於Lua這一類指令碼語言來說 處理大資料運算絕對不是明智之舉

基於Java的快速排序演算法,我有些不敢相信自己的眼睛了 同樣的快速排序演算法 跑在JVM上的java居然比C++快一些 500W個排序資料 花了不到2s的時間.........................

import java.lang.String; import java.util.Date;import java.util.Random;public class QuickSort {  public static final int MAX_SIZE=5000000;//執行個體初始化{this.a=new int[MAX_SIZE];///System.out.println("插入前時間:"+new Date().getTime()+"ms");Random rm=new Random(100) ;for(int i=0;i=high)return ;int begin=low;int end=high;int key=arr[begin]; //key  while(begin=key){ --end;}arr[begin]=arr[end];while(begin  
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.