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
 

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












目录
相关文章
|
10天前
|
存储 监控 算法
员工屏幕监控系统之 C++ 图像差分算法
在现代企业管理中,员工屏幕监控系统至关重要。本文探讨了其中常用的图像差分算法,该算法通过比较相邻两帧图像的像素差异,检测屏幕内容变化,如应用程序切换等。文中提供了C++实现代码,并介绍了其在实时监控、异常行为检测和数据压缩等方面的应用,展示了其实现简单、效率高的特点。
37 15
|
10天前
|
算法 Serverless 数据处理
从集思录可转债数据探秘:Python与C++实现的移动平均算法应用
本文探讨了如何利用移动平均算法分析集思录提供的可转债数据,帮助投资者把握价格趋势。通过Python和C++两种编程语言实现简单移动平均(SMA),展示了数据处理的具体方法。Python代码借助`pandas`库轻松计算5日SMA,而C++代码则通过高效的数据处理展示了SMA的计算过程。集思录平台提供了详尽且及时的可转债数据,助力投资者结合算法与社区讨论,做出更明智的投资决策。掌握这些工具和技术,有助于在复杂多变的金融市场中挖掘更多价值。
38 12
|
1天前
|
存储 监控 算法
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
在数字化办公时代,公司监控上网软件成为企业管理网络资源和保障信息安全的关键工具。本文深入剖析C++中的链表数据结构及其在该软件中的应用。链表通过节点存储网络访问记录,具备高效插入、删除操作及节省内存的优势,助力企业实时追踪员工上网行为,提升运营效率并降低安全风险。示例代码展示了如何用C++实现链表记录上网行为,并模拟发送至服务器。链表为公司监控上网软件提供了灵活高效的数据管理方式,但实际开发还需考虑安全性、隐私保护等多方面因素。
11 0
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
|
7天前
|
缓存 监控 算法
内网监控管理软件:PHP 语言队列算法揭秘
在数字化办公环境中,内网监控管理软件对企业的稳定运行和信息安全至关重要。本文深入介绍PHP中的队列算法及其在内网监控软件中的应用,包括监控数据收集、任务调度和日志记录等场景,通过代码示例展示其实现方法。队列算法可提高性能、保证数据顺序并实现异步处理,为企业提供高效的安全保障。
18 1
|
1月前
|
负载均衡 算法 安全
探秘:基于 C++ 的局域网电脑控制软件自适应指令分发算法
在现代企业信息化架构中,局域网电脑控制软件如同“指挥官”,通过自适应指令分发算法动态调整指令发送节奏与数据量,确保不同性能的终端设备高效运行。基于C++语言,利用套接字实现稳定连接和线程同步管理,结合实时状态反馈,优化指令分发策略,提升整体管控效率,保障网络稳定,助力数字化办公。
60 19
|
1月前
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
54 2
|
2月前
|
存储 算法 安全
基于红黑树的局域网上网行为控制C++ 算法解析
在当今网络环境中,局域网上网行为控制对企业和学校至关重要。本文探讨了一种基于红黑树数据结构的高效算法,用于管理用户的上网行为,如IP地址、上网时长、访问网站类别和流量使用情况。通过红黑树的自平衡特性,确保了高效的查找、插入和删除操作。文中提供了C++代码示例,展示了如何实现该算法,并强调其在网络管理中的应用价值。
|
1月前
|
存储 算法 安全
基于哈希表的文件共享平台 C++ 算法实现与分析
在数字化时代,文件共享平台不可或缺。本文探讨哈希表在文件共享中的应用,包括原理、优势及C++实现。哈希表通过键值对快速访问文件元数据(如文件名、大小、位置等),查找时间复杂度为O(1),显著提升查找速度和用户体验。代码示例展示了文件上传和搜索功能,实际应用中需解决哈希冲突、动态扩容和线程安全等问题,以优化性能。
|
2月前
|
算法 安全 C++
用 C++ 算法控制员工上网的软件,关键逻辑是啥?来深度解读下
在企业信息化管理中,控制员工上网的软件成为保障网络秩序与提升办公效率的关键工具。该软件基于C++语言,融合红黑树、令牌桶和滑动窗口等算法,实现网址精准过滤、流量均衡分配及异常连接监测。通过高效的数据结构与算法设计,确保企业网络资源优化配置与安全防护升级,同时尊重员工权益,助力企业数字化发展。
66 4
|
3月前
|
存储 SQL 数据处理
PHP中如何高效地处理大规模数据的排序?
在PHP中处理大规模数据排序时,选择合适的方法至关重要。对于内存内可以处理的数据,可以直接使用PHP内置排序函数;对于超出内存限制的数据,可以考虑分块处理、外部排序或利用数据库的排序功能。根据具体应用场景和数据规模,选择最佳的排序策略,确保排序操作高效且稳定。
44 2

热门文章

最新文章