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
 

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












目录
相关文章
|
2月前
|
存储 人工智能 算法
【C++数据结构——内排序】二路归并排序(头歌实践教学平台习题)【合集】
本关任务是实现二路归并算法,即将两个有序数组合并为一个有序数组。主要内容包括: - **任务描述**:实现二路归并算法。 - **相关知识**: - 二路归并算法的基本概念。 - 算法步骤:通过比较两个有序数组的元素,依次将较小的元素放入新数组中。 - 代码示例(以 C++ 为例)。 - 时间复杂度为 O(m+n),空间复杂度为 O(m+n)。 - **测试说明**:平台会对你编写的代码进行测试,提供输入和输出示例。 - **通关代码**:提供了完整的 C++ 实现代码。 - **测试结果**:展示代码运行后的排序结果。 开始你的任务吧,祝你成功!
60 10
|
2月前
|
搜索推荐 算法 数据处理
【C++数据结构——内排序】希尔排序(头歌实践教学平台习题)【合集】
本文介绍了希尔排序算法的实现及相关知识。主要内容包括: - **任务描述**:实现希尔排序算法。 - **相关知识**: - 排序算法基础概念,如稳定性。 - 插入排序的基本思想和步骤。 - 间隔序列(增量序列)的概念及其在希尔排序中的应用。 - 算法的时间复杂度和空间复杂度分析。 - 代码实现技巧,如循环嵌套和索引计算。 - **测试说明**:提供了测试输入和输出示例,帮助验证代码正确性。 - **我的通关代码**:给出了完整的C++代码实现。 - **测试结果**:展示了代码运行的测试结果。 通过这些内容,读者可以全面了解希尔排序的原理和实现方法。
72 10
|
7月前
|
搜索推荐 算法 Java
手写快排:教你用Java写出高效排序算法!
快速排序(QuickSort)是经典的排序算法之一,基于分治思想,平均时间复杂度为O(n log n),广泛应用于各种场合。在这篇文章中,我们将手写一个Java版本的快速排序,从基础实现到优化策略,并逐步解析代码背后的逻辑。
224 1
|
2月前
|
搜索推荐 C++
【C++数据结构——内排序】快速排序(头歌实践教学平台习题)【合集】
快速排序是一种高效的排序算法,基于分治策略。它的主要思想是通过选择一个基准元素(pivot),将数组划分成两部分。一部分的元素都小于等于基准元素,另一部分的元素都大于等于基准元素。然后对这两部分分别进行排序,最终使整个数组有序。(第一行是元素个数,第二行是待排序的原始关键字数据。本关任务:实现快速排序算法。开始你的任务吧,祝你成功!
61 7
|
2月前
|
存储 算法 搜索推荐
【C++面向对象——群体类和群体数据的组织】实现含排序功能的数组类(头歌实践教学平台习题)【合集】
1. **相关排序和查找算法的原理**:介绍直接插入排序、直接选择排序、冒泡排序和顺序查找的基本原理及其实现代码。 2. **C++ 类与成员函数的定义**:讲解如何定义`Array`类,包括类的声明和实现,以及成员函数的定义与调用。 3. **数组作为类的成员变量的处理**:探讨内存管理和正确访问数组元素的方法,确保在类中正确使用动态分配的数组。 4. **函数参数传递与返回值处理**:解释排序和查找函数的参数传递方式及返回值处理,确保函数功能正确实现。 通过掌握这些知识,可以顺利地将排序和查找算法封装到`Array`类中,并进行测试验证。编程要求是在右侧编辑器补充代码以实现三种排序算法
59 5
ly~
|
6月前
|
安全 Java 大数据
php跟java有什么区别
PHP 和 Java 是两种常用编程语言,各有特色。PHP 语法简洁灵活,适用于快速开发中小型网站,尤其在 Web 脚本和数据库交互中表现出色。Java 则语法严谨,强类型特性使其在企业级应用、移动开发及大数据处理中更受欢迎,具备高稳定性和安全性。通过优化,PHP 性能可提升,而 Java 在大规模应用中表现更佳。总体而言,PHP 开发效率高但维护性稍差,Java 则更注重代码质量和安全性。
ly~
186 5
|
7月前
|
Java 应用服务中间件 PHP
PHP——调用java文件中的方法
PHP——调用java文件中的方法
76 0
PHP——调用java文件中的方法
|
7月前
|
Java PHP 开发者
PHP中的异常处理:Java常见的编码方式
在PHP开发中,掌握异常处理至关重要,它有助于预见并管理运行时错误,避免用户体验受损或数据丢失。本文介绍PHP异常处理的基本概念与实践,包括try-catch语句的使用,以及如何通过抛出和捕获异常来增强代码的健壮性和可靠性。通过示例展示如何避免常见错误,如除数为零的情况,并探讨多catch块和finally语句的高级用法,帮助开发者提升程序稳定性与可维护性。[总字符数:238]
50 0
|
7月前
|
数据采集 搜索推荐 算法
【高手进阶】Java排序算法:从零到精通——揭秘冒泡、快速、归并排序的原理与实战应用,让你的代码效率飙升!
【8月更文挑战第21天】Java排序算法是编程基础的重要部分,在算法设计与分析及实际开发中不可或缺。本文介绍内部排序算法,包括简单的冒泡排序及其逐步优化至高效的快速排序和稳定的归并排序,并提供了每种算法的Java实现示例。此外,还探讨了排序算法在电子商务、搜索引擎和数据分析等领域的广泛应用,帮助读者更好地理解和应用这些算法。
79 0
|
9月前
|
Java PHP 数据安全/隐私保护
php和Java配合 aes
php和Java配合 aes加密
69 1

热门文章

最新文章