LuaJIT2.1 和 Lua5.4.8 性能对比
说明
最近在学习 LuaJIT,想看看把它接入到项目中使用,会提高多大的性能。
今天抽时间,简单地测试了一下 LuaJIT 2.2 和 Lua5.4.8 的性能。
测试平台:
- 系统:Windows 10 WSL
- CPU:Intel® Core™ i7-8700 CPU @ 3.20GHz 3.19 GHz
- 内存:48.0 GB
下面测试结果只是我简单测试的结果,仅供参考。
相关代码在最后面。
综合性能对比分析
第一组测试(详细性能对比)
测试项目 | Lua 5.4 | LuaJIT | 性能提升 |
---|---|---|---|
Fibonacci(30) 递归 | 0.0515秒 | 0.0095秒 | 5.4倍 |
数学操作(10万次) | 0.0125秒 | 0.0022秒 | 5.7倍 |
字符串操作 | 0.0033秒 | 0.0043秒 | 0.8倍 |
表操作(10万) | 0.0797秒 | 0.0322秒 | 2.5倍 |
第二组测试(深度分析)
测试规模/类型 | Lua 5.4 | LuaJIT | 性能提升 |
---|---|---|---|
100万次循环 | 0.0041秒 | 0.0010秒 | 4.1倍 |
500万次循环 | 0.0204秒 | 0.0051秒 | 4.0倍 |
1000万次循环 | 0.0407秒 | 0.0102秒 | 4.0倍 |
浮点运算(100万) | 0.0298秒 | 0.0056秒 | 5.3倍 |
整数操作 | 0.0062秒 | 0.0010秒 | 6.2倍 |
浮点操作 | 0.0069秒 | 0.0010秒 | 6.9倍 |
顺序访问 | 0.0020秒 | 0.0006秒 | 3.3倍 |
随机访问 | 0.0034秒 | 0.0010秒 | 3.4倍 |
关键说明
1. 稳定的性能提升
LuaJIT在所有数值计算任务上都展现了4-7倍的性能提升,这个倍数很稳定,说明JIT优化效果是可预测的。
2. 规模无关的优化效果
从100万到1000万次循环,性能提升倍数保持在4倍左右,说明LuaJIT的优化效果不受问题规模影响。
3. 内存使用效率
- Lua 5.4: 1048.76 KB
- LuaJIT: 563.17 KB
LuaJIT使用了约**46%**更少的内存,这可能因为:
- 更高效的对象表示
- 不同的垃圾回收策略
- JIT编译后的代码更紧凑
4. 类型统一优化
在LuaJIT中,整数和浮点操作的性能几乎相同(都是0.0010秒),这说明JIT编译器成功地进行了类型特化优化。
5. 内存访问模式优化
LuaJIT对顺序访问和随机访问都有显著优化,但顺序访问的优势更明显。
6. JIT预热效果
有趣的是,这次测试中JIT预热效果不明显(1.01倍),这可能因为:
- 测试代码相对简单,很快就被优化了
- 测试规模足够大,预热时间相对较短
相关代码
测试1
-- detailed_comparison.lua
print("=== Detailed Performance Comparison ===")
print("Lua Version:", _VERSION)
print("Engine:", jit and jit.version or "Standard Lua Interpreter")
print()local function benchmark(name, func, ...)collectgarbage("collect")local start = os.clock()local result = func(...)local elapsed = os.clock() - startprint(string.format("%-30s: %8.4f seconds", name, elapsed))return elapsed
end-- 避免溢出的斐波那契测试
local function safe_fibonacci(n)if n <= 1 then return n endlocal a, b = 0, 1for i = 2, n doa, b = b, a + b-- 检查是否即将溢出if b > 1e15 thenreturn b -- 提前返回避免溢出endendreturn b
end-- 不同规模的递归测试
local function fib_recursive(n)if n <= 1 then return n endreturn fib_recursive(n-1) + fib_recursive(n-2)
end-- 数学计算密集
local function math_intensive(n)local sum = 0for i = 1, n dosum = sum + math.sin(i) * math.cos(i) + math.sqrt(i)endreturn sum
end-- 字符串操作
local function string_operations(n)local result = ""for i = 1, n doresult = result .. tostring(i)if #result > 100000 then break end -- 避免内存问题endreturn #result
end-- table密集操作
local function table_intensive(n)local t = {}for i = 1, n dot[i] = {x = i, y = i * 2, data = "item" .. i}endlocal sum = 0for i = 1, n dosum = sum + t[i].x + t[i].yendreturn sum
endprint("Running benchmarks...")-- 适中的测试规模
benchmark("Fibonacci(30) recursive", fib_recursive, 30)
benchmark("Safe Fibonacci(100000)", safe_fibonacci, 100000)
benchmark("Math operations (100K)", math_intensive, 100000)
benchmark("String operations", string_operations, 5000)
benchmark("Table operations (100K)", table_intensive, 100000)-- 显示内存使用
collectgarbage("collect")
print(string.format("\nMemory usage: %.2f KB", collectgarbage("count")))-- JIT特定信息
if jit thenprint("\nJIT Information:")print("Status:", jit.status())print("Architecture:", jit.arch)-- 显示编译的trace数量local traces = 0for i = 1, 1000 doif jit.util and jit.util.traceinfo and jit.util.traceinfo(i) thentraces = traces + 1endendif traces > 0 thenprint("Compiled traces:", traces)end
end
测试代码2:
-- deep_analysis.lua
print("=== Deep Performance Analysis ===")
print("Engine:", jit and jit.version or ("Standard " .. _VERSION))
print()local function benchmark_with_analysis(name, func, iterations, ...)-- 预热运行func(...)-- 多次测试求平均值local times = {}for i = 1, iterations docollectgarbage("collect")local start = os.clock()local result = func(...)local elapsed = os.clock() - starttimes[i] = elapsedend-- 计算统计信息local total = 0local min_time = times[1]local max_time = times[1]for i = 1, iterations dototal = total + times[i]if times[i] < min_time then min_time = times[i] endif times[i] > max_time then max_time = times[i] endendlocal avg_time = total / iterationsprint(string.format("%-25s: avg=%.4fs, min=%.4fs, max=%.4fs", name, avg_time, min_time, max_time))return avg_time
end-- 不同规模的循环测试
local function loop_test(n)local sum = 0for i = 1, n dosum = sum + iendreturn sum
end-- 浮点数密集计算
local function float_intensive(n)local x = 1.0for i = 1, n dox = x * 1.000001x = math.sqrt(x)endreturn x
end-- 整数vs浮点数操作
local function integer_ops(n)local sum = 0for i = 1, n dosum = sum + (i * 2) -- 整数运算endreturn sum
endlocal function float_ops(n)local sum = 0.0for i = 1, n dosum = sum + (i * 2.0) -- 浮点运算endreturn sum
end-- 表访问模式测试
local function sequential_access(n)local t = {}for i = 1, n dot[i] = iendlocal sum = 0for i = 1, n dosum = sum + t[i]endreturn sum
endlocal function random_access(n)local t = {}for i = 1, n dot[i] = iendlocal sum = 0for i = 1, n dolocal idx = (i * 17 + 31) % n + 1 -- 伪随机访问sum = sum + t[idx]endreturn sum
endprint("Multiple runs for statistical accuracy:")
print()-- 不同规模的测试
local sizes = {1000000, 5000000, 10000000}
for _, size in ipairs(sizes) doprint(string.format("=== Scale: %d operations ===", size))benchmark_with_analysis("Loop " .. size, loop_test, 3, size)if size <= 1000000 then -- 避免浮点运算太慢benchmark_with_analysis("Float " .. size, float_intensive, 3, size)endprint()
endprint("=== Data Type Comparison ===")
benchmark_with_analysis("Integer operations", integer_ops, 5, 1000000)
benchmark_with_analysis("Float operations", float_ops, 5, 1000000)
print()print("=== Memory Access Patterns ===")
benchmark_with_analysis("Sequential access", sequential_access, 3, 100000)
benchmark_with_analysis("Random access", random_access, 3, 100000)
print()-- JIT特定分析
if jit thenprint("=== JIT Warmup Analysis ===")local function warmup_test(n)local sum = 0for i = 1, n dosum = sum + math.sin(i) * math.cos(i)endreturn sumend-- 冷启动local start = os.clock()warmup_test(100000)local cold_time = os.clock() - start-- 预热后local start2 = os.clock()warmup_test(100000)local warm_time = os.clock() - start2print(string.format("Cold start: %.4fs", cold_time))print(string.format("After warmup: %.4fs", warm_time))print(string.format("Warmup speedup: %.2fx", cold_time / warm_time))
end
.
.
上述测试结果只是我简单测试的结果,仅供参考(图片AI生成)
.
.
相关文章:

LuaJIT2.1 和 Lua5.4.8 性能对比
说明 最近在学习 LuaJIT,想看看把它接入到项目中使用,会提高多大的性能。 今天抽时间,简单地测试了一下 LuaJIT 2.2 和 Lua5.4.8 的性能。 测试平台: 系统:Windows 10 WSLCPU:Intel Core™ i7-8700 CPU…...
深度学习姿态估计实战:基于ONNX Runtime的YOLOv8 Pose部署全解析
本文将详细介绍如何脱离YOLO官方环境,使用ONNX Runtime部署YOLOv8姿态估计模型。内容包括模型加载、图像预处理(Letterbox缩放和填充)、推理执行、输出解码(边界框和关键点处理)、非极大值抑制(NMS…...
深度探索:如何用DeepSeek重构你的工作流
前言:AI时代的工作革命 在人工智能浪潮席卷的今天,DeepSeek作为国产大模型的代表之一,正以其强大的自然语言处理能力、代码生成能力和多模态交互特性,重新定义着人类的工作方式。根据IDC报告显示,2024年企业级AI应用市场规模已突破800亿美元,其中智能办公场景占比达32%,…...

深入解析与解决方案:处理Elasticsearch中all found copies are either stale or corrupt未分配分片问题
目录 引言 1 问题诊断深入分析 1.1 错误含义深度解析 1.2 获取详细的诊断信息 2 解决方案选择与决策流程 2.1 可用选项全面对比 2.2 推荐处理流程与决策树 3 具体操作步骤详解 3.1 优先尝试 - 分配最新副本(最低风险) 3.2 中等风险方案 - 分配…...

【NLP 78、手搓Transformer模型结构】
你以为走不出的淤泥,也迟早会云淡风轻 —— 25.5.31 引言 ——《Attention is all you need》 《Attention is all you need》这篇论文可以说是自然语言处理领域的一座里程碑,它提出的 Transformer 结构带来了一场技术革命。 研究背景与目标 在 Transfo…...
yum更换阿里云的镜像源
步骤 1:备份原有源配置(重要!) sudo mkdir /etc/yum.repos.d/backup sudo mv /etc/yum.repos.d/CentOS-* /etc/yum.repos.d/backup/步骤 2:下载阿里云源配置 sudo curl -o /etc/yum.repos.d/CentOS-Base.repo https:…...

如何自定义WordPress主题(5个分步教程)
如果您已经安装了一个 WordPress 主题,但它不太适合您,您可能会感到沮丧。在定制 WordPress 主题方面,您有很多选择。 挑战在于找到正确的方法。 在本篇文章中,我将引导您了解自定义 WordPress 主题的各种选项,帮助您…...
ios版本的Tiktok二次安装不上,提示:Unable to Install “TikTok”
问题:Domain: IXUserPresentableErrorDomain Code: 1 Recovery Suggestion: Failed to load Info.plist from bundle at path /private/var/containers/Bundle/Application/E99D86D4-F96E-48F9-86C5-FE095A22E13A/DouyinDev.app/PlugIns/AwemeNotificationService.a…...

react实现markdown文件预览
文章目录 react实现markdown文件预览1、实现md文件预览2、解决图片不显示3、实现效果 react实现markdown文件预览 1、实现md文件预览 1️⃣第一步:安装依赖: npm install react-markdown remark-gfmreact-markdown:将 Markdown 渲染为 Rea…...
Neo4j 认证与授权:原理、技术与最佳实践深度解析
Neo4j 作为领先的图数据库,其安全机制——认证(Authentication)与授权(Authorization)——是保障数据资产的核心防线。本文将深入剖析其工作原理、关键技术、实用技巧及行业最佳实践,助您构建坚不可摧的图数据安全体系。 Neo4j 提供了强大且灵活的认证授权框架,涵盖从基…...
Android Studio 配置之gitignore
1.创建或编辑.gitignore文件 在项目根目录下检查是否已有.gitignore文件。如果没有,创建一个新文件,命名为.gitignore(注意文件名前有个点)。 添加忽略规则:在.gitignore中添加以下内容: 忽略整个 .idea …...

PDF处理控件Aspose.PDF教程:在 C# 中更改 PDF 页面大小
PDF 的页面大小决定了其内容的显示、打印或处理方式。我们通常在准备打印、转换格式或标准化布局时需要更改 PDF 页面大小。在本文中,您将学习如何使用 C# 更改任何 PDF 文件的页面大小。我们将通过完整的代码示例,逐步指导您完成操作。 Aspose.PDF最新…...
Perl One-liner 数据处理——基础语法篇【匠心】
Perl(Practical Extraction and Report Language)是一种功能强大且灵活的脚本语言,因其强大的文本处理能力和简洁的语法而广受开发者和系统管理员的喜爱。特别是在命令行环境下,Perl 的 one-liner(单行脚本)以其高效、简洁的特点,成为数据处理、文本转换和快速原型设计的…...
PHP 打印扩展开发:从易联云到小鹅通的多驱动集成实践
目前已有易联云WIFI打印机扩展 扩展入口文件 文件目录 crmeb\services\printer\Printer.php namespace crmeb\services\printer;use crmeb\basic\BaseManager; use think\facade\Config; use think\Container;/*** Class Printer* package crmeb\services\auth* mixin \crme…...

rust或tauri项目执行命令的时候,cmd窗口也会弹出显示解决方法
阻止 Tauri 执行命令时弹出 CMD 窗口 当你在 Tauri 中使用 tokio::process::Command 执行命令时弹出 CMD 窗口,这是因为 Windows 默认会为控制台程序创建可见窗口。以下是几种解决方法: 1. 使用 Windows 特有的创建标志 (推荐) #[tauri::command] pub…...
[软件工程] 文档 | 技术文档撰写全流程指南
技术文档撰写全流程指南 一份优秀的技术文档需平衡 “技术严谨性” 与 “用户友好性”,其本质是降低信息传递成本,让读者能快速获取所需信息,减少沟通与试错成本。在实际操作中,从明确目标、结构化内容、可视化表达,到…...

使用Python进行函数作画
前言 因为之前通过deepseek绘制一下卡通的人物根本就不像,又想起来之前又大佬通过函数绘制了一些图像,想着能不能用Python来实现,结果发现可以,不过一些细节还是需要自己调整,deepseek整体的框架是没有问题࿰…...
Python应用continue关键字初解
大家好!对于刚接触编程的初学者来说,理解循环控制语句是掌握编程语言的重要一步。在Python中,continue关键字是一个非常实用的循环控制工具,本文将通过简易示例帮助大家理解它的作用。 基本概念: continue关键字用于中断本次循环,…...

微型导轨在手术机器人领域中有哪些关键操作?
在微创手术领域,手术机器人凭借其高精度、高稳定性和远程操控能力,正逐步成为现代外科手术的重要工具。微型导轨作为一种专为高精度运动设计的线性导向系统,凭借其亚微米级定位精度、低摩擦运动特性及紧凑结构设计,已成为手术机器…...

FPGA 的硬件结构
FPGA 的基本结构分为5 部分:可编程逻辑块(CLB)、输入/输出块(IOB)、逻辑块之间的布线资源、内嵌RAM 和内嵌的功能单元。 (1)可编程逻辑块(CLB) 一个基本的可编程逻辑块由…...

EasyRTC音视频实时通话助力新一代WebP2P视频物联网应用解决方案
一、方案背景 物联网技术深刻变革各行业,视频物联在智慧城市、工业监控等场景广泛应用。传统方案依赖中心服务器中转,存在传输效率低、网络负载大的问题。新一代WebP2P视频物联技术实现设备直连,降低网络压力并提升传输效率,成…...

QT开发技术【ffmpeg + QAudioOutput】音乐播放器 完善
一、完善上章的功能,形成一个小工具 QT开发技术【ffmpeg QAudioOutput】音乐播放器 二、增加歌曲保存类 #include "../Include/MusicListManager.h" #include "QtGui/Include/Conversion.h" #include <QFile> #include <QXmlStream…...

vscode 离线安装第三方库跳转库
我安装的是C/C的函数跳转 下载的离线库: 项目首页 - vscode代码自动补全跳转插件离线安装包:cpptools-win32.vsix是一款专为VSCode设计的离线安装插件,特别适合无法连接网络的电脑环境。通过安装此插件,您的VSCode将获得强大的代码自动跳转…...

DevExpress WinForms v24.2 - 新增日程组件、电子表格组件功能扩展
DevExpress WinForms拥有180组件和UI库,能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜…...

基于机器学习的心脏病预测模型构建与可解释性分析
一、引言 心脏病是威胁人类健康的重要疾病之一,早期预测和诊断对防治心脏病具有重要意义。本文利用公开的心脏病数据集,通过机器学习算法构建预测模型,并使用 SHAP 值进行模型可解释性分析,旨在为心脏病的辅助诊断提供参考。 二、…...
VisDrone无人机视觉挑战赛观察解析2025.6.5
VisDrone无人机视觉挑战赛观察解析 历史沿革与发展进程 VisDrone无人机视觉挑战赛由天津大学联合国内外多所高校及科研机构发起,自2018年起依托ECCV、ICCV等顶级计算机视觉会议连续举办,已成为全球无人机视觉领域最具影响力的学术竞赛之一。赛事以推动无人机平台视觉算法创…...
Monorepo架构: Lerna、NX、Turbo等对比与应用分析
概述 对于大型的 Monorepo 项目来说,Nx 绝对算是神器,在包管理和版本控制部分有优势对于大型 Monorepo 项目,Nx 是非常实用的工具,在包管理、版本控制以及构建、测试优化等方面都有一定作用下面我们来对比一下这几种工具 NPM 包…...
redis进入后台操作、查看key、删除key
cmd进入 redis后台 避免报错NOAUTH Authentication required 第一步 ./redis-cli -h 127.0.0.1 -p 6379第二步 AUTH YourPassword通过key删除redis缓存 进了后台之后输入 keys * 删除key del key1...

谷粒商城-分布式微服务项目-高级篇[三]
十五、商城业务-支付 15.1 支付宝支付 15.1.1 进入“蚂蚁金服开放平台” 支付宝开放 平台地址: 支付宝开放平台 15.1.2 下载支付宝官方 demo,进行配置和测试 开发者文档:支付宝开放平台文档中心 电脑网站支付文档:小程序文…...

实现购物车微信小程序
实现一个微信小程序购物车页面,包含以下功能: 需求说明: 商品列表:显示商品名称、价格、数量加减按钮,支持修改商品数量(数量≥1)。 全选 / 反选功能:顶部 “全选” 复选框&#…...