未定义参数的性能损失

2023-12-26

我经常在函数中使用可选参数,但一些测试显示它们在 Firefox 和 safari 中性能受到巨大影响(70-95%)。奇怪的是,如果我传入文字值不明确的那么就没有处罚。这里可能发生什么?我不会认为这是一个作用域链问题,因为它们本质上是函数的本地问题。我要开始通过吗不明确的每个可选参数?

jsPerf: http://jsperf.com/function-undefined-args/2 http://jsperf.com/function-undefined-args/2


对于这样的函数:

function threeArgs(x, y, z) {
  return x + y + z;
}

就是这样称呼的:

threeArgs(1, 2, 3);

优化器可以自由选择不生成任何代码。它很容易确定没有副作用,因为该函数只是引用其参数值并返回简单表达式的结果。由于返回值被忽略,因此运行时根本没有理由执行任何操作。

除此之外,如果代码是:

something += threeArgs(1, 2, 3);

优化器可能决定生成大致相当于以下内容的代码:

something += 6;

为什么?因为调用是使用数字常量进行的,并且它可以在代码生成时安全地折叠这些常量。这可能是保守的,因为数字很奇怪,但这里它们都是整数,所以它可以很好地做到这一点。即使没有,它也可以安全地内联该函数:

something += 1 + 2 + 3;

然而,当缺少参数时,优化器可能会退出并生成真正的函数调用。对于这样一个简单的函数,函数调用的开销很容易导致性能上的巨大差异。

通过在测试中使用变量而不是常量,并实际使用函数的返回值,您可以“迷惑”优化器并防止它跳过调用或预先计算结果,但您无法阻止它内联。我仍然认为你的结果很有趣,因为这个原因:它揭示了这样一个事实:(无论如何,截至今天)这些优化器对函数的调用方式很敏感。

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

未定义参数的性能损失 的相关文章

随机推荐

  • 无法使用 Google PHP 客户端将内容类型设置为 Google Storage

    我在用着google api php 客户端 https code google com p google api php client 这是我上传 jpg 图像的部分 postbody array data gt imgData gso
  • Java中的PUT请求[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我正在尝试用 Java 发送 PUT 请求 其中 header 和 body 为 json 格式 正文需要具有特定名称
  • 降低 Windows 上 multiprocessing.Pool 的进程优先级

    I use multiprocessing Pool 并行化一些繁重的 Pandas 处理 但发现它有点太成功了 我的 CPU 使用率达到 100 整个计算机变得非常无响应 就连鼠标也变得难以使用 我可以使用此代码更改进程的进程优先级 im
  • 在我的不和谐网络钩子中,我收到错误:{“embeds”:[“0”]}

    我正在制作一个不和谐的 webhook 来记录某些内容 我在模板的帮助下完成了它 我不擅长 php 但我不断收到错误 embeds 0 我已经尝试过研究它 但没有得到任何有用的信息 请注意我这样做是为了测试的混乱 这是我的代码
  • 无法在 Angular2 中设置未定义 ckeditor 的属性“dir”

    每当我尝试加载 Ckeditor 时 都会收到 无法设置未定义的属性 dir 我正在使用 angular cli 来开发我的 Angular2 应用程序 CKEditor版本 4 4 7 当我使用 ngserve 运行应用程序时 此问题不会
  • 使用 JAX-RS 进行文件上传

    我尝试将文件从 JavaScript 客户端上传到 JAX RS Java 服务器 我在我的服务器上使用以下 REST 上传功能 POST Produces application json UploadDto upload Context
  • 从字符串中删除所有出现的 \

    我正在尝试使用 JSON 从服务器获取对象数组 服务器向我发送以下字符串 DealComment null DealVotes DealId 1 CompanyId 1 StartDate 2012 12 13T00 00 00 EndDa
  • 在vba中连接两个数组?

    我如何将这些数组与结果结合起来 2 4 5 3 7 6 array1 Array 4 5 3 7 6 array2 Array 2 你有可能Join 并连接两个数组 然后Split 结果返回到一个新数组 array3 Split Join
  • 防止 Visual Studio Code 中的自动分号

    我正在使用 Visual Studio 代码 我不想在 CSS 属性后面加上自动分号 但 VS Code 给了我一个我不喜欢的自动完成选项 如何停止 CSS 属性末尾的自动完成分号 设置 gt 扩展 gt CSS 取消选中带有分号的完整属性
  • “无法加载包‘regex-posix’……未知符号‘regerror’”

    对于一个新项目 我一直在尝试构建threepenny gui包 我过去已经做过很多次了 没有任何问题 然而这一次 我遇到了一条不寻常的错误消息 gt stack build threepenny gui gt configure three
  • ODEi​​nt:任意精度的自适应积分

    ODEi nt 是否可以使用adaptive具有任意精度算术的积分例程 例如 我想将 Boost 多精度库与集成自适应 函数和受控步进器一起使用 ODEi nt 文档提供了对integrat const 使用任意精度算术的示例 但我无法修改
  • Windows Phone 8.1 上使用 .resx 资源时出现 MissingManifestResourceException

    我正在开发一个也针对 Android Xamarin 的 Windows Phone 8 1 应用程序 正如我在 PCL 上添加字符串资源 resx 并在启动器项目中引用它们以在我的视图中使用它一样 这一切在 WP 8 1 silverli
  • MySQL 中的字符串连接

    我正在使用 MySQL 和 MySQL Workbench 5 2 CE 当我尝试连接两列时 last name and first name 它不起作用 select first name last name as Name from t
  • + 运算符什么时候比 StringBuilder 更快? [复制]

    这个问题在这里已经有答案了 过去 我一直相信你应该使用StringBuilder and append String 当用变量构建字符串时 而不是string split i 在什么情况下这是准确的 我问是因为通常情况下 如果我要写以下内容
  • 直接从无窗口 Linux 终端启动 OpenGL 应用程序

    究竟如何让 OpenGL 应用程序直接从终端 Ubuntu Server 9 04 全屏运行 我在我的服务器上开发了一个用于视觉诊断的应用程序 但是 我不完全确定让它在无窗口环境中运行的最佳方法 理想情况下 我会运行我的程序 visuald
  • 在 TFS 中的解决方案之间共享代码 [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我有几个不同的应用程序 我需要在它们之间共享代码以减少维护 我尝试在 stackoverflow 和 web 上阅读大量
  • 提取两个字符串之间不同的字符

    我用过adist计算两个字符串之间不同的字符数 a lt Happy day b lt Tappy Pay adist a b result 2 现在我想提取那些不同的字符 在我的示例中 我想获取字符串 Hd or TP 没关系 我试着看一
  • 通过 Gmail 发送电子邮件时出现错误

    在这里 我尝试使用 gmail 发送邮件 但出现以下错误 javax mail AuthenticationFailedException 534 5 7 14
  • 在 Laravel 4 中显示自定义验证的错误消息

    我通过创建一个类创建了一个自定义错误函数
  • 未定义参数的性能损失

    我经常在函数中使用可选参数 但一些测试显示它们在 Firefox 和 safari 中性能受到巨大影响 70 95 奇怪的是 如果我传入文字值不明确的那么就没有处罚 这里可能发生什么 我不会认为这是一个作用域链问题 因为它们本质上是函数的本