Lua中table内建排序与C/C++/Java/php/等内排序算法的排序效率比较

简介: Lua这类脚本语言在处理业务逻辑作为配置文件的时候方便省事 但是在大量需要 运算的地方就显得略微不足   按照 Lua内建排序算法 对比C/C++ PHP Java等的快速排序算法进行一下比较。

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

~~~还是附上代码吧

<?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/>';

?>



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]=i
end
print('插入数据后时间:',os.clock())
print('插入了',#sorTable,'个数据!')
print('排序前时间:',os.clock())
table.sort(sorTable,
function(a,b)
  if(a<b) then 
    return true
  else
   return false
  end
end 
)
print("排序后时间:",os.clock())

如上代码在 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的数据 进行递归从而进行排序
//时间复杂度是 nlog2n
void QuickSort(int arr[],int low,int high)
{
	if(low>=high)
		return ;
	int begin=low ; //记录当前调用的起点index
	int end=high  ; //记录当前的终点index
	int 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; //最后将key放入到剩余位置 
	QuickSort(arr,low,begin-1);  //left 递归
	QuickSort(arr,begin+1,high);  //right 递归
}

int  _tmain(int argc,char*argv[])
{
	int *pArray=new int[ARRSIZE];
	time_t  tm ;
	time(&tm);
	printf("插入前时间:%d\n",tm);
	srand((unsigned int)time(NULL));
	for (int i=0;i<ARRSIZE;i++)
	{
		pArray[i]=rand();
	}
	time(&tm);
	printf("插入后时间:%d\n",tm);
	time(&tm);
	printf("排序前时间:%d\n",tm);
	QuickSort(pArray,0,ARRSIZE-1);
	time(&tm);
	printf("排序后时间:%d\n",tm);
	delete []pArray;
	return  0 ;
}

 
运行结果可想而知,对于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<QuickSort.MAX_SIZE;i++)
		{
		   this.a[i]=rm.nextInt(50000) ; //随机数
		}
		System.out.println("插入后时间:"+new Date().getTime()+"ms");
		System.out.println("排序前时间:"+new Date().getTime()+"ms");
		QuickSortMethod(this.a,0,this.a.length-1); 
		System.out.println("排序后时间:"+new Date().getTime()+"ms");
		//System.out.println(Arrays.toString(this.a));
	}
	//快速排序算法java实现  和C++一样
	public void QuickSortMethod(int[] arr,int low,int high)
	{
		if(low>=high)
			return ;
		int begin=low;
		int end=high;
		int key=arr[begin]; //key  
		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;
		QuickSortMethod(arr,low,begin-1);
		QuickSortMethod(arr,begin+1,high);
		
	}
	private int[] a;
    public static void  main(String[]argv)
    {
    	new QuickSort();
	}
}

上图



QQ 4223665    技术交流群

  群号是387761601
 

欢迎大家一起交流软件技术












目录
相关文章
|
8天前
|
监控 算法 网络协议
Java 实现局域网电脑屏幕监控算法揭秘
在数字化办公环境中,局域网电脑屏幕监控至关重要。本文介绍用Java实现这一功能的算法,涵盖图像采集、数据传输和监控端显示三个关键环节。通过Java的AWT/Swing库和Robot类抓取屏幕图像,使用Socket进行TCP/IP通信传输图像数据,并利用ImageIO类在监控端展示图像。整个过程确保高效、实时和准确,为提升数字化管理提供了技术基础。
40 15
|
3月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
102 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
14天前
|
缓存 算法 搜索推荐
Java中的算法优化与复杂度分析
在Java开发中,理解和优化算法的时间复杂度和空间复杂度是提升程序性能的关键。通过合理选择数据结构、避免重复计算、应用分治法等策略,可以显著提高算法效率。在实际开发中,应该根据具体需求和场景,选择合适的优化方法,从而编写出高效、可靠的代码。
25 6
|
1月前
|
Java Android开发 C++
Java和C++
Java和C++
43 15
WK
|
2月前
|
安全 Java 编译器
C++和Java哪个更好用
C++和Java各具优势,选择取决于项目需求、开发者偏好及目标平台特性。C++性能出色,适合游戏、实时系统等;Java平台独立性强,适合跨平台、安全敏感应用。C++提供硬件访问和灵活编程范式,Java有自动内存管理和丰富库支持。两者各有千秋,需根据具体需求选择。
WK
48 1
|
3月前
|
IDE Java 程序员
C++ 程序员的 Java 指南
一个 C++ 程序员自己总结的 Java 学习中应该注意的点。
27 5
|
3月前
|
算法 搜索推荐 Java
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
这篇文章介绍了如何使用Java后端技术,结合Graphics2D和Echarts等工具,生成包含个性化信息和图表的海报,并提供了详细的代码实现和GitHub项目链接。
165 0
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
WK
|
2月前
|
开发框架 移动开发 Java
C++和Java哪个更适合开发移动应用
本文对比了C++和Java在移动应用开发中的优劣,从市场需求、学习难度、开发效率、跨平台性和应用领域等方面进行了详细分析。Java在Android开发中占据优势,而C++则适合对性能要求较高的场景。选择应根据具体需求和个人偏好综合考虑。
WK
70 0
WK
|
2月前
|
安全 Java 编译器
C++和Java哪个更适合开发web网站
在Web开发领域,C++和Java各具优势。C++以其高性能、低级控制和跨平台性著称,适用于需要高吞吐量和低延迟的场景,如实时交易系统和在线游戏服务器。Java则凭借其跨平台性、丰富的生态系统和强大的安全性,广泛应用于企业级Web开发,如企业管理系统和电子商务平台。选择时需根据项目需求和技术储备综合考虑。
WK
123 0
|
3月前
|
算法 Java Linux
java制作海报一:java使用Graphics2D 在图片上写字,文字换行算法详解
这篇文章介绍了如何在Java中使用Graphics2D在图片上绘制文字,并实现自动换行的功能。
176 0