LuaJIT2.1 和 Lua5.4.8 性能对比

news2025/6/6 19:10:01

在这里插入图片描述

说明

最近在学习 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.4LuaJIT性能提升
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.4LuaJIT性能提升
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() - start
    print(string.format("%-30s: %8.4f seconds", name, elapsed))
    return elapsed
end

-- 避免溢出的斐波那契测试
local function safe_fibonacci(n)
    if n <= 1 then return n end
    local a, b = 0, 1
    for i = 2, n do
        a, b = b, a + b
        -- 检查是否即将溢出
        if b > 1e15 then
            return b  -- 提前返回避免溢出
        end
    end
    return b
end

-- 不同规模的递归测试
local function fib_recursive(n)
    if n <= 1 then return n end
    return fib_recursive(n-1) + fib_recursive(n-2)
end

-- 数学计算密集
local function math_intensive(n)
    local sum = 0
    for i = 1, n do
        sum = sum + math.sin(i) * math.cos(i) + math.sqrt(i)
    end
    return sum
end

-- 字符串操作
local function string_operations(n)
    local result = ""
    for i = 1, n do
        result = result .. tostring(i)
        if #result > 100000 then break end  -- 避免内存问题
    end
    return #result
end

-- table密集操作
local function table_intensive(n)
    local t = {}
    for i = 1, n do
        t[i] = {x = i, y = i * 2, data = "item" .. i}
    end
    
    local sum = 0
    for i = 1, n do
        sum = sum + t[i].x + t[i].y
    end
    return sum
end

print("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 then
    print("\nJIT Information:")
    print("Status:", jit.status())
    print("Architecture:", jit.arch)
    
    -- 显示编译的trace数量
    local traces = 0
    for i = 1, 1000 do
        if jit.util and jit.util.traceinfo and jit.util.traceinfo(i) then
            traces = traces + 1
        end
    end
    if traces > 0 then
        print("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 do
        collectgarbage("collect")
        local start = os.clock()
        local result = func(...)
        local elapsed = os.clock() - start
        times[i] = elapsed
    end
    
    -- 计算统计信息
    local total = 0
    local min_time = times[1]
    local max_time = times[1]
    
    for i = 1, iterations do
        total = total + times[i]
        if times[i] < min_time then min_time = times[i] end
        if times[i] > max_time then max_time = times[i] end
    end
    
    local avg_time = total / iterations
    print(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 = 0
    for i = 1, n do
        sum = sum + i
    end
    return sum
end

-- 浮点数密集计算
local function float_intensive(n)
    local x = 1.0
    for i = 1, n do
        x = x * 1.000001
        x = math.sqrt(x)
    end
    return x
end

-- 整数vs浮点数操作
local function integer_ops(n)
    local sum = 0
    for i = 1, n do
        sum = sum + (i * 2)  -- 整数运算
    end
    return sum
end

local function float_ops(n)
    local sum = 0.0
    for i = 1, n do
        sum = sum + (i * 2.0)  -- 浮点运算
    end
    return sum
end

-- 表访问模式测试
local function sequential_access(n)
    local t = {}
    for i = 1, n do
        t[i] = i
    end
    
    local sum = 0
    for i = 1, n do
        sum = sum + t[i]
    end
    return sum
end

local function random_access(n)
    local t = {}
    for i = 1, n do
        t[i] = i
    end
    
    local sum = 0
    for i = 1, n do
        local idx = (i * 17 + 31) % n + 1  -- 伪随机访问
        sum = sum + t[idx]
    end
    return sum
end

print("Multiple runs for statistical accuracy:")
print()

-- 不同规模的测试
local sizes = {1000000, 5000000, 10000000}
for _, size in ipairs(sizes) do
    print(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)
    end
    print()
end

print("=== 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 then
    print("=== JIT Warmup Analysis ===")
    
    local function warmup_test(n)
        local sum = 0
        for i = 1, n do
            sum = sum + math.sin(i) * math.cos(i)
        end
        return sum
    end
    
    -- 冷启动
    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() - start2
    
    print(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生成)
.
.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2402009.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入解析与解决方案:处理Elasticsearch中all found copies are either stale or corrupt未分配分片问题

目录 引言 1 问题诊断深入分析 1.1 错误含义深度解析 1.2 获取详细的诊断信息 2 解决方案选择与决策流程 2.1 可用选项全面对比 2.2 推荐处理流程与决策树 3 具体操作步骤详解 3.1 优先尝试 - 分配最新副本&#xff08;最低风险&#xff09; 3.2 中等风险方案 - 分配…

【NLP 78、手搓Transformer模型结构】

你以为走不出的淤泥&#xff0c;也迟早会云淡风轻 —— 25.5.31 引言 ——《Attention is all you need》 《Attention is all you need》这篇论文可以说是自然语言处理领域的一座里程碑&#xff0c;它提出的 Transformer 结构带来了一场技术革命。 研究背景与目标 在 Transfo…

如何自定义WordPress主题(5个分步教程)

如果您已经安装了一个 WordPress 主题&#xff0c;但它不太适合您&#xff0c;您可能会感到沮丧。在定制 WordPress 主题方面&#xff0c;您有很多选择。 挑战在于找到正确的方法。 在本篇文章中&#xff0c;我将引导您了解自定义 WordPress 主题的各种选项&#xff0c;帮助您…

react实现markdown文件预览

文章目录 react实现markdown文件预览1、实现md文件预览2、解决图片不显示3、实现效果 react实现markdown文件预览 1、实现md文件预览 1️⃣第一步&#xff1a;安装依赖&#xff1a; npm install react-markdown remark-gfmreact-markdown&#xff1a;将 Markdown 渲染为 Rea…

PDF处理控件Aspose.PDF教程:在 C# 中更改 PDF 页面大小

PDF 的页面大小决定了其内容的显示、打印或处理方式。我们通常在准备打印、转换格式或标准化布局时需要更改 PDF 页面大小。在本文中&#xff0c;您将学习如何使用 C# 更改任何 PDF 文件的页面大小。我们将通过完整的代码示例&#xff0c;逐步指导您完成操作。 Aspose.PDF最新…

rust或tauri项目执行命令的时候,cmd窗口也会弹出显示解决方法

阻止 Tauri 执行命令时弹出 CMD 窗口 当你在 Tauri 中使用 tokio::process::Command 执行命令时弹出 CMD 窗口&#xff0c;这是因为 Windows 默认会为控制台程序创建可见窗口。以下是几种解决方法&#xff1a; 1. 使用 Windows 特有的创建标志 (推荐) #[tauri::command] pub…

使用Python进行函数作画

前言 因为之前通过deepseek绘制一下卡通的人物根本就不像&#xff0c;又想起来之前又大佬通过函数绘制了一些图像&#xff0c;想着能不能用Python来实现&#xff0c;结果发现可以&#xff0c;不过一些细节还是需要自己调整&#xff0c;deepseek整体的框架是没有问题&#xff0…

微型导轨在手术机器人领域中有哪些关键操作?

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

FPGA 的硬件结构

FPGA 的基本结构分为5 部分&#xff1a;可编程逻辑块&#xff08;CLB&#xff09;、输入/输出块&#xff08;IOB&#xff09;、逻辑块之间的布线资源、内嵌RAM 和内嵌的功能单元。 &#xff08;1&#xff09;可编程逻辑块&#xff08;CLB&#xff09; 一个基本的可编程逻辑块由…

EasyRTC音视频实时通话助力新一代WebP2P视频物联网应用解决方案

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

QT开发技术【ffmpeg + QAudioOutput】音乐播放器 完善

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

vscode 离线安装第三方库跳转库

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

DevExpress WinForms v24.2 - 新增日程组件、电子表格组件功能扩展

DevExpress WinForms拥有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序&#xff0c;无论是Office风格的界面&#xff0c;还是分析处理大批量的业务数据&#xff0c;它都能轻松胜…

基于机器学习的心脏病预测模型构建与可解释性分析

一、引言 心脏病是威胁人类健康的重要疾病之一&#xff0c;早期预测和诊断对防治心脏病具有重要意义。本文利用公开的心脏病数据集&#xff0c;通过机器学习算法构建预测模型&#xff0c;并使用 SHAP 值进行模型可解释性分析&#xff0c;旨在为心脏病的辅助诊断提供参考。 二、…

谷粒商城-分布式微服务项目-高级篇[三]

十五、商城业务-支付 15.1 支付宝支付 15.1.1 进入“蚂蚁金服开放平台” 支付宝开放 平台地址&#xff1a; 支付宝开放平台 15.1.2 下载支付宝官方 demo&#xff0c;进行配置和测试 开发者文档&#xff1a;支付宝开放平台文档中心 电脑网站支付文档&#xff1a;小程序文…

实现购物车微信小程序

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

26考研 | 王道 | 计算机组成原理 | 四、指令系统

26考研 | 王道 | 计算机组成原理 | 四、指令系统 文章目录 26考研 | 王道 | 计算机组成原理 | 四、指令系统1.指令系统0.指令集体系结构1. 指令格式1.按地址码数目不同来分2.指令-按指令长度分类3.指令-按操作码长度分类4.指令-按操作类型分类 2. 扩展操作码指令格式 2.指令的寻…

在 Windows 系统安装 Git

前往官网下载Git - Downloads 目录 一、下载安装包 二、安装 Git 三、安装完成 四、验证安装 五、问题解决 解决步骤 一、下载安装包 点击页面右侧 “Download for Windows” 按钮。 点击页面最上方 “Click here to download” &#xff0c;下载 Git for Windows/x64 …

基于InternLM的情感调节大师FunGPT

基于书生系列大模型&#xff0c;社区用户不断创造出令人耳目一新的项目&#xff0c;从灵感萌发到落地实践&#xff0c;每一个都充满智慧与价值。“与书生共创”将陆续推出一系列文章&#xff0c;分享这些项目背后的故事与经验。欢迎订阅并积极投稿&#xff0c;一起分享经验与成…

【性能调优系列】深入解析火焰图:从基础阅读到性能优化实战

博客目录 一、火焰图基础&#xff1a;结构与阅读方法二、深入分析火焰图&#xff1a;关键观察点与性能瓶颈识别1. 识别最宽的函数块2. HTTP 请求处理分析3. 数据库操作分析4. 业务逻辑分析 三、性能优化实战&#xff1a;从火焰图到解决方案1. 线程池性能优化2. 数据库访问优化3…