luajit VS C,运行性能超过C?

Posted 彪哥分晓

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了luajit VS C,运行性能超过C?相关的知识,希望对你有一定的参考价值。

最近需要做一个CPU计算密集型的服务。在设计完数据结构和算法之后分别采用lua 和 C 预算实现了一遍,发现lua运行效率一点不输C的效率,而根据我实际编写代码耗时看,差不多是C语言一半的时间消耗或者三分之一。


废话不多说,先描述实验方法

  1.  使用C语言完成测试代码编写,采用gcc 10.2.0 版本分别使用 -O0 -O1 -O2 -O3 编译三个可执行版本。

  2. 采用lua + FFI 完成相同的功能,包括数据结构和代码级的函数结构。使用resty 命令行来运行lua脚本。


数组遍历查找、赋值



通过上图可以看到性能排行  C-O3 > C-O2 = luajit = C-O1 > C-O1 

分析结论:

luajit代码运行效率大致相当于 C-O2 这个优化级别,运行效率是C代码未优化代码的250%左右。在正常情况下如果C代码不进行编译优化luajit运行效率是要更高一点。


if 大概率分支预测


做过代码级优化的同学都知道编译器、CPU都可以做分支预测优化。通俗来讲就是编译器、CPU在静态分析代码和动态监控指令执行过程中对大概率进入的分支进行预测,以优化代码执行效率。比如指令的预加载等。luajit 则是对大概率执行的代码分支做jit编译。

从上图中可以看到,luajit在总体的执行中完全优于C-O0的。随着第一分支的命中率不断提高,大概在65%的时候超越了C-O3级别的优化,在 80-90%命中率的情况下基本追平了C-O2优化水平。所以在写lua代码的时候可以将大概率命中的if条件写在前面,这样有助于luajit做分支预判优化。

具体为什么在这种情况下 C-O3的执行效率反而变慢,这个我不是很清楚了。


内存占用

lua代码内存占用与C代码内存占用基本一致,这也是lua这一门小巧的胶水语言带来的优势。


综上所述

luajit + FFI 技术实现的代码运行效率可认为基本等同于C语言实现的代码效率,且对系统也没有过多的额外资源占用。

大多数情况下在生产运行的代码一般会选择 -O0 或者是 -O2 -g 编译选择以方便在发送错误时可以快速定位问题。所以我觉得luajit确实可以用来在生产上替换一些需要快速调整逻辑、动态发布上线的代码可以考虑使用lua来编写,使用luajit来运行。


另外在这里我就忍不住想要吐槽一下redis没有引入luajit作为luaVM而是采用了标准lua作为运行环境。有知道的大佬也可以告诉我一声,让我学习学习。


本文主要是在测试环境做luajit与C语言的性能对比。如果想看真实业务情况下luajit与C语言性能差异可以查看这篇文章。


写在后面的话

这边文章讲的这些优化点都是一些非常小的优化点,只有在非常极端的条件下才需要做如此细微的优化,在正常逻辑编写中还是要做到可读性、可维护性优先。读者如果是做业务开发的工程师,大可不必花大量的时间在这些细枝末节的优化之上。反而在写代码之前好好设计一下数据结构,优化一下业务逻辑能带来更加显著的性能提升。所谓“小聪明敌不过大智慧”。