在 Rust 中使用本地函数是否会对性能产生负面影响?

2023-12-30

我最近意识到我可以在 Rust 中创建本地函数(函数中的函数)。似乎是清理代码而不污染文件函数空间的好方法。下面是我所说的本地函数与“外部”函数的小样本:

fn main() {
    fn local_plus(x: i64, y: i64) -> i64 {
        x + y
    }
    let x = 2i64;
    let y = 5i64;

    let local_res = local_plus(x, y);
    let external_res = external_plus(x,y);
    assert_eq!(local_res, external_res);
}

fn external_plus(x: i64, y: i64)  -> i64 {
    x + y
}

我想知道这样做是否会对性能产生负面影响?就像 Rust 会在每次包含函数运行时重新声明函数或占用一些不需要的函数空间一样吗?或者它实际上对性能没有影响吗?

顺便说一句,任何有关我如何为自己找到答案的提示(通过阅读任何特定的文档集或我可以使用的工具)都将受到欢迎。


没有影响;我检查了为两个变体生成的程序集,它是相同的。

我对比的两个版本:

“外部的”:

fn main() {
    let x = 2i64;
    let y = 5i64;

    let external_res = external_plus(x,y);
}

fn external_plus(x: i64, y: i64)  -> i64 {
    x + y
}

"local":

fn main() {
    fn local_plus(x: i64, y: i64) -> i64 {
        x + y
    }
    let x = 2i64;
    let y = 5i64;

    let local_res = local_plus(x, y);
}

两者都产生相同的 asm 结果(今天每晚的发布模式):

    .text
    .file   "rust_out.cgu-0.rs"
    .section    .text._ZN8rust_out4main17hb497928495d48c40E,"ax",@progbits
    .p2align    4, 0x90
    .type   _ZN8rust_out4main17hb497928495d48c40E,@function
_ZN8rust_out4main17hb497928495d48c40E:
    .cfi_startproc
    retq
.Lfunc_end0:
    .size   _ZN8rust_out4main17hb497928495d48c40E, .Lfunc_end0-_ZN8rust_out4main17hb497928495d48c40E
    .cfi_endproc

    .section    .text.main,"ax",@progbits
    .globl  main
    .p2align    4, 0x90
    .type   main,@function
main:
    .cfi_startproc
    movq    %rsi, %rax
    movq    %rdi, %rcx
    leaq    _ZN8rust_out4main17hb497928495d48c40E(%rip), %rdi
    movq    %rcx, %rsi
    movq    %rax, %rdx
    jmp _ZN3std2rt10lang_start17h14cbded5fe3cd915E@PLT
.Lfunc_end1:
    .size   main, .Lfunc_end1-main
    .cfi_endproc


    .section    ".note.GNU-stack","",@progbits

这意味着生成的二进制文件将存在零差异(不仅是性能方面的差异)。

更重要的是,即使你使用一个函数也没关系;采用以下方法:

fn main() {
    let x = 2i64;
    let y = 5i64;

    let res = x + y;
}

也产生相同的组件。

最重要的是,一般来说,无论您是否在中声明函数,函数都会被内联main()或在其之外。

Edit:正如 Shepmaster 指出的那样,在这个程序中没有副作用,因此两种变体生成的程序集实际上与以下程序集相同:

fn main() {}

然而,两者的 MIR 输出也相同(并且与空白的输出不同)main()),因此即使存在副作用,函数位置也不应该有任何差异。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Rust 中使用本地函数是否会对性能产生负面影响? 的相关文章

随机推荐

  • Javascript:如何删除for循环中的最后一个逗号

    如何从此函数中删除最后一个逗号 for var i 0 i lt 100 i if i 2 0 div innerHTML l else div innerHTML 首先 使用数组而不是字符串来求和字符串 这样速度更快 第二 var arr
  • 如何制作长度为5的随机数字和字母字符串? [复制]

    这个问题在这里已经有答案了 可能的重复 这是生成随机字符字符串的好方法吗 https stackoverflow com questions 976646 is this a good way to generate a string of
  • jQuery ui Sortable 可以表现得像 gridster 吗?

    是否可以得到jQuery ui 可排序网格 http jqueryui com sortable display grid表现得像gridster http gridster net 为什么不使用网格斯特 因为它不适用于 IE9 以下的任何
  • 如何使用 ggrepel 抑制警告

    ggrepel允许通过排斥彼此太近的标签来避免文本标签重叠 该算法取决于查看窗口大小 并且当窗口大小更改时会发生回调 如果算法无法避免给定窗口大小的重叠 则会发出警告 Warning messages 1 ggrepel 178 unlab
  • 转换函数指针

    我正在编写一个函数 它接收一个指向比较函数的指针和一个数组MyStructs并应该根据比较函数对数组进行排序 void myStructSort struct MyStruct arr int size int comp const str
  • 更改 iOS XCode 项目中的产品名称宏

    我在上面构建了我的 iPhone 代码苹果的示例项目 http developer apple com library ios samplecode LazyTableImages Introduction Intro html 当应用程序
  • UTF8 与宽字符?

    我似乎在思考某些事情时遇到了一些困难 我正在尝试创建一个 C 函数来将 UTF8 转换为 Wide 我开始谷歌搜索 发现了 Boost 和 ICU 两者看起来都太大了 然后我找到了 utf cpp 头库 看起来不错 我通过这里的一些线程发现
  • 将文本设置为整数值

    我想设置一个TextView作为整数的值 希望像这样 tv setText int 我尝试了这个 但出现了这个错误 另外 我的整数值在另一个类中 D AndroidRuntime Shutting down VM E AndroidRunt
  • 使用 python-pptx 添加项目符号列表

    我正在使用 python pptx 库进行 pptx 操作 我想在 pptx 文档中添加项目符号列表 我使用以下代码片段添加列表项 p text frame add paragraph run p add run p level 0 run
  • 如何只获取一次脚本

    所以这是一个简化的问题 我将其用作参考 以使这个问题变得简单 如果超过 x 像素 则使用 resize 来 getScript jQuery https stackoverflow com questions 11388247 using
  • 记录 mongoose 在应用程序中触发的所有查询

    我有使用nodejs和mongodb的应用程序 我曾使用猫鼬进行ODM 现在我想记录猫鼬在整个应用程序期间触发的所有查询 如何记录这些 您可以像这样启用调试模式 mongoose set debug true 或添加您自己的调试回调 mon
  • 从视觉 API 预览条码扫描仪的尺寸

    我正在使用 Google 的 Android Vision API 中的条形码阅读器示例 预览尺寸似乎没有填满整个可用空间 我使用的是 Nexus 4 预览右侧有一个白色的未使用空间 大约是宽度的 1 3 我希望能够在各种设备上运行这个示例
  • (类型错误:无法在 HttpHeaders.applyUpdate 处读取 null 属性“长度”)Angular 5,Http 客户端

    我在服务中发出 http 请求时收到此响应 这是登录组件 export class LoginComponent credentials Credentials constructor private auth AuthService In
  • Swift 运行时文档 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我一直在探索Apple的swift文档 现在我来这里询问 有关于 Swift 运行时的文档吗 我读过 Swift 编程语言 一书 http
  • 按索引级别为 Pandas Multiindex DataFrame 赋值

    我有一个 Pandas 多索引数据框 我需要为系列中的一列分配值 该系列与数据帧的第一级索引共享其索引 import pandas as pd import numpy as np idx0 np array bar bar bar baz
  • 检查请求是 GET 还是 POST

    在我的控制器 动作中 if empty POST if Auth attempt Input get data return Redirect intended else Session flash error message 有没有方法在
  • 在 CSS 中使用图像文件与数据 URI

    我正在尝试确定包含我编写的脚本所需的图像的最佳方式 我发现这个网站 http www jimbojw com wiki index php title Data URIs and Inline Images这让我考虑尝试这种方法将图像作为d
  • 在 WPF 应用程序中使用手写笔或手指按下触摸屏上的按钮时出现异常

    我有一个带有初始窗口的 WPF 应用程序 该窗口在启动时显示为闪屏 在启动过程中 有一个后台线程 我们可以通过单击启动屏幕中的按钮来取消该线程 使用鼠标并单击按钮取消时 这一切都可以正常工作 但是 如果我使用触摸屏单击此按钮 那么应用程序偶
  • PHP:如何获取相关文件的URL

    PHP 是否有一个本机函数可以返回使用相对路径声明的文件的完整 URL 我需要得到 http www domain com projects test img share jpg from img share jpg 到目前为止 我已经尝试
  • 在 Rust 中使用本地函数是否会对性能产生负面影响?

    我最近意识到我可以在 Rust 中创建本地函数 函数中的函数 似乎是清理代码而不污染文件函数空间的好方法 下面是我所说的本地函数与 外部 函数的小样本 fn main fn local plus x i64 y i64 gt i64 x y