ruby 3.2.0 现已发布,该版本添加了许多功能和性能改进。具体更新内容如下: 基于 wasi 的 webassembly 支持 这是基于 wasi 的 webassembly 支持的初始移植。此项特性使得 cruby 二进制文件可在 web 浏览器、serverless edge 环境和其他 webassembly/wasi 嵌入器上使用。目前,此移植可在不使用 thread api 的前提下通过基本和引导测试套件的测试。 生产就绪的 yjit yjit 不再是实验性的
已经在生产工作负载上进行了一年多的测试,证明非常稳定。
yjit 现在支持 linux、macos、bsd 和其他 unix 平台上的 x86-64 和 arm64/aarch64 cpu。
此版本支持 apple m1/m2、aws graviton、raspberry pi 4 等。
构建 yjit 现在需要 rust 1.58.0+。[feature #18481 ]
为了确保 cruby 是使用 yjit 构建的,请在运行./configure 脚本之前安装 rustc>= 1.58.0 。
yjit 3.2 版本比 3.1 更快,内存开销大约是 3.1 的 1/3。
总体而言,yjit 比 yjit-bench 上的 ruby 解释器快 41%(几何平均值)。
jit 代码的物理内存是延迟分配的。与 ruby 3.1 不同,ruby 进程的 rss 被最小化,因为 --yjit-exec-mem-size 分配的虚拟内存页在 jit 代码实际使用之前不会映射到物理内存页。
引入 code gc,当 jit 代码的内存消耗达到 --yjit-exec-mem-size 时,释放所有代码页。
rubyvm::yjit.runtime_stats 在现有的 inline_code_size 和 outlined_code_sizekeys 之外,还返回 code gc metrics: code_gc_count、live_page_count、freed_page_count 和 freed_code_size。
由 rubyvm::yjit.runtime_stats 生成的大部分统计数据现在都可以在发布版本中使用。
只需使用 --yjit-stats运行 ruby 来计算和转储统计信息(会产生一些运行时开销)。
yjit 现在经过优化以利用 object shapes。[feature #18776 ]
在定义新常量时,利用更细粒度的常量失效来减少代码的无效化。[feature #18589 ]
默认 --yjit-exec-mem-size 更改为 64 (mib)。
默认 --yjit-call-threshold 更改为 30。
针对 redos 的正则表达式改进 由于正则表达式匹配会耗费不少时间,当代码试图向不受信任的输入匹配低效的正则表达式时,攻击者可能会利用它进行 dos 攻击(即正则表达式 dos,或称作 redos)。因此新版本引入了两项可显着缓解 redos 攻击的改进。改进的正则表达式匹配算法从 ruby 3.2 开始,regexp 的匹配算法通过使用记忆技术得到了极大的改进。# this match takes 10 sec. in ruby 3.1, and 0.003 sec. in ruby 3.2 /^a*b?a*$/ =~ a * 50000 + x 改进后的匹配算法使得大多数 regexp 匹配(实验中大约为 90%)在线性时间内完成。对于 3.2.0 预览版本的用户:此优化可能会消耗与每个匹配的输入长度成比例的内存。预计不会出现实际问题,因为此内存分配通常会延迟,并且正常的 regexp 匹配最多应消耗 10 倍的内存输入长度。正则表达式超时退出机制此版本引入了正则表达式超时退出机制。regexp.timeout = 1.0/^a*b?a*$/ =~ a * 50000 + x#=> regexp::timeouterror is raised in one second regexp.timeout 根据 ruby 应用程序的要求进行配置,可以防止或显着降低 dos 的风险。请注意,regexp.timeout 是全局配置项,如果希望对某些特殊的正则表达式使用不同的超时设置,需要使用 timeout 关键字 regexp.new。regexp.timeout = 1.0# this regexp has no timeoutlong_time_re = regexp.new(^a*b?a*$, timeout: nil)long_time_re =~ a * 50000 + x # never interrupted 此项特性的最初提案:https://bugs.ruby-lang.org/issues/17837 其他值得注意的新功能 语法建议 syntax_suggest(以前的 dead_end)的功能已集成到 ruby 中,可以帮助找到错误的位置,例如丢失或多余的 end 。
unmatched `end', missing keyword (`do', `def`, `if`, etc.) ? 1 class dog> 2 defbark> 4 end 5 end [feature #18159]错误高亮 现在它指向 typeerror 和 argumenterror 的相关参数
test.rbin `+': nil can't be coerced into integer (typeerror)sum = ary[0] + ary[1] ^^^^^^ 语言 匿名 rest 和关键字 rest 参数可以作为参数传递,而不仅仅是在方法参数中使用。[feature #18351]
deffoo(*) bar(*) end defbaz(**) quux(**) end 更多详情可查看官方公告:https://www.ruby-lang.org/en/news/2022/12/25/ruby-3-2-0-released/
企业微电网能效管理平台服务商安科瑞参展第23届全国医院建设大会
感应耐压试验装置的技术参数及使用技巧
了解电流检测电阻器的TCR
【新专利介绍】一种步入式高低温快速温变试验箱
华为,一家持续稳健成长的创新企业
Ruby 3.2.0正式发布 新增多项改进
负载均衡是怎么工作的?
上海集成电路产业飞速发展,进入双边发展新阶段
探讨一下智能表面的关键技术
立昂微实控人等减持立昂转债339万张,套现超4亿元
华进公司成为无锡市智能传感器产业知识产权联盟理事单位
关于安全可调稳压器设计教程
一文看懂英特尔为什么要收购Altera?
小米mix2什么时候上市?小米mix2最新消息:骁龙835+98%屏占比+1900万像素,这或许才是你最满意的小米手机
学车遇上VR有什么额外的效果
索尼WH-CH710N现身FCC,欲将在CES 2020展会上亮相
将“小蛋糕”做大 还得看各家“后招”!
“芯火天地”企业家沙龙活动第16期中移系企业供需对接会在宁举行
商汤科技在智能视觉方面的进展和落地应用方面的实践
Epsxe如何设置比较好,浅谈Epsxe设置的方法