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.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() - 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生成)
.
.

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/908303.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/908303.shtml
英文地址,請注明出處:http://en.pswp.cn/news/908303.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Arduino學習-按鍵燈

哎&#xff0c;別笑&#xff0c;總比刷抖音強點吧 1、效果 2、代碼 const int buttonPin2; const int ledPin13;int buttonState0;void setup() {// put your setup code here, to run once:pinMode(buttonPin,INPUT);pinMode(ledPin,OUTPUT); }void loop() {// put your mai…

強化學習魚書(10)——更多深度強化學習的算法

&#xff1a;是否使用環境模型&#xff08;狀態遷移函數P(s’|s,a)和獎 勵函數r(s&#xff0c;a&#xff0c;V)&#xff09;。不使用環境模型的方法叫作無模型&#xff08;model-free&#xff09;的方法&#xff0c;使用環境模型的方法叫作有模型&#xff08;model-based&#…

9.axios底層原理,和promise的對比(2)

&#x1f63a;&#x1f63a;&#x1f63a; 和promise的對比 完全可以直接使用 Promise 來發 HTTP 請求&#xff0c;比如用原生 fetch Promise 就可以實現網絡請求功能&#x1f447; ? 用 Promise fetch 的寫法&#xff08;原生&#xff09; fetch(‘https://api.example.c…

什么是數據孤島?如何實現從數據孤島到數據共享?

目錄 一、數據孤島是什么&#xff1f; &#xff08;一&#xff09;數據孤島的定義 &#xff08;二&#xff09;數據孤島怎么形成的 二、數據孤島帶來的問題 &#xff08;一&#xff09;數據冗余和不一致 &#xff08;二&#xff09;決策效率低下 &#xff08;三&#xf…

MQTT入門實戰寶典:從零起步掌握物聯網核心通信協議

MQTT入門實戰寶典&#xff1a;從零起步掌握物聯網核心通信協議 前言 物聯網時代&#xff0c;萬物互聯已成為現實&#xff0c;而MQTT協議作為這個時代的"數據總線"&#xff0c;正默默支撐著從智能家居到工業物聯的各類應用場景。本文將帶你揭開MQTT的神秘面紗&#…

I2C通信講解

I2C總線發展史 怎么在一條串口線上連接多個設備呢&#xff1f; 由于速度同步線是由主機實時發出的&#xff0c;所以主機可以按需求修改通信速度&#xff0c;這樣在一條線上可以掛接不同速度的器件&#xff0c;單片機和性能差的器件通信&#xff0c;就輸出較慢的脈沖信號&#x…

Windows 10 IoT 系統深度定制指南:從環境搭建到工業部署

目錄 一、Windows 10 IoT 架構特性與版本選型 1.1 核心架構設計 1.2 版本對比與選型建議 二、開發環境搭建與硬件適配 2.1 工具鏈配置 2.2 硬件適配關鍵步驟 三、系統定制流程詳解 3.1 鏡像定制&#xff08;IoT Core Dashboard&#xff09; 3.2 使用ICD&#xff08;Im…

k8s開發webhook使用certmanager生成證書

1.創建 Issuer apiVersion: cert-manager.io/v1 kind: Issuer metadata:name: selfsigned-issuernamespace: default spec:selfSigned: {}2.Certificate&#xff08;自動生成 TLS 證書&#xff09; apiVersion: cert-manager.io/v1 kind: Certificate metadata:name: webhook…

MyBatis-Plus深度全解:從入門到企業級實戰

MyBatis-Plus深度全解&#xff1a;從入門到企業級實戰 一、為什么選擇MyBatis-Plus&#xff1f; 1.1 MyBatis的痛點 - 重復CRUD代碼編寫 - 分頁功能實現復雜 - 缺少通用Service層封裝 - 動態表名支持困難 - 多租戶方案需自行實現1.2 MyBatis-Plus核心優勢 無侵入&#xff1a…

【無標題】路徑著色問題的革命性重構:拓撲色動力學模型下的超越與升華

路徑著色問題的革命性重構&#xff1a;拓撲色動力學模型下的超越與升華 一、以色列路徑著色模型的根本局限 mermaid graph TB A[以色列路徑著色模型] --> B[強連通約束] A --> C[僅實邊三角剖分] A --> D[靜態色彩分配] B --> E[無法描述非相鄰關系] C --> F[忽…

01 Deep learning神經網絡的編程基礎 二分類--吳恩達

二分類 1. 核心定義 二分類任務是監督學習中最基礎的問題類型&#xff0c;其目標是將樣本劃分為兩個互斥類別。設樣本特征空間為 X ? R n \mathcal{X} \subseteq \mathbb{R}^n X?Rn&#xff0c;輸出空間為 Y { 0 , 1 } \mathcal{Y} \{0,1\} Y{0,1}&#xff0c;學習目標為…

數據結構:遞歸:泰勒展開式(Taylor Series Expansion)

目錄 第一步&#xff1a;?我們要解決什么&#xff1f; 第二步&#xff1a;將其類比為求自然數和 第三步&#xff1a;什么是每一項&#xff1f; 第四步&#xff1a;定義要計算的每一項&#xff08;term&#xff09; 第五步&#xff1a;定義遞歸函數結構 &#x1f333; 調用…

Hadolint:Dockerfile 語法檢查與最佳實踐驗證的終極工具

在容器化應用開發的浪潮中,Dockerfile 作為構建 Docker 鏡像的核心配置文件,其質量直接影響著應用的安全性、穩定性和可維護性。然而,隨著項目復雜度的增加,手動檢查 Dockerfile 不僅耗時,還容易遺漏潛在問題。今天,我要向大家介紹一款強大的工具——Hadolint,它將徹底改…

redis數據過期策略、淘汰策略

過期鍵的刪除策略? ??1. 被動刪除&#xff08;惰性刪除&#xff09;?? ??觸發時機??&#xff1a;當客戶端嘗試訪問某個鍵時&#xff0c;Redis會先檢查該鍵是否過期。就是說&#xff0c;我們不時時檢查每個鍵是否過期&#xff0c;而是在使用到這個鍵時檢查是否過期&a…

ES 學習總結一 基礎內容

ElasticSearch學習 一、 初識ES1、 認識與安裝2、 倒排索引2.1 正向索引2.2 倒排索引 3、 基本概念3.1 文檔和字段3.2 索引和倒排 4 、 IK分詞器 二、 操作1、 mapping 映射屬性2、 索引庫增刪改查3、 文檔的增刪改查3.1 新增文檔3.2 查詢文檔3.3 刪除文檔3.4 修改文檔3.5 批處…

鴻蒙任務項設置案例實戰

目錄 案例效果 資源文件與初始化 string.json color.json CommonConstant 添加任務 首頁組件 任務列表初始化 任務列表視圖 任務編輯頁 添加跳轉 任務目標設置模型&#xff08;formatParams&#xff09; 編輯頁面 詳情頁 任務編輯列表項 目標設置展示 引入目標…

DeepSeek-R1-0528重磅升級:三大突破重新定義AI生產力

2025年5月28日&#xff0c;中國AI領軍企業深度求索&#xff08;DeepSeek&#xff09;正式發布DeepSeek-R1-0528版本&#xff0c;這是繼2025年1月R1模型登頂中美App Store后&#xff0c;DeepSeek在通用大模型領域的又一次戰略級突破。此次升級雖為小版本迭代&#xff0c;卻在推理…

【算法訓練營Day07】字符串part1

文章目錄 反轉字符串反轉字符串II替換數字 反轉字符串 題目鏈接&#xff1a;344. 反轉字符串 雙指針法&#xff0c;兩個指針的元素直接調轉即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …

中國西部逐日1 km全天候地表溫度數據集(TRIMS LST-TP;2000-2024)

時間分辨率&#xff1a;日空間分辨率&#xff1a;100m - 1km共享方式&#xff1a;開放獲取數據大小&#xff1a;474.31 GB數據時間范圍&#xff1a;2000-01-01 — 2024-12-31元數據更新時間&#xff1a;2025-05-31 數據集摘要 青藏高原是全球氣候變化的敏感區域。地表溫度&…

PPT轉圖片拼貼工具 v1.0

軟件介紹 這個軟件的作用就是將單個PPT的每一頁轉換為單獨的圖片&#xff0c;然后將圖片進行拼接起來。 但是我沒有還沒有解決一次性處理多個文件。 效果展示如下&#xff1a; 軟件安裝 軟件源碼 import os import re import win32com.client from PIL import Imagedef con…