什么更快?运行空函数或检查函数是否未定义? [关闭]

2024-02-04

我正在编写一些代码,其中作为参数传入的函数有时可能是未定义的。我很好奇这是一种不好的“做法”,我想知道什么实际上更快?给出一个空函数,或者让函数检查参数是否未定义?

我做了以下测试来尝试。答案非常令人惊讶!

var timesTest = 1000;

function empty(){}
console.time('running an empty function');
for( var i=0; i<timesTest; i++ ){
  empty();
}
console.timeEnd('running an empty function');

var somethingthatdoesnotexist;
console.time('checking if a function exists');
for( var i=0; i<timesTest; i++ ){
  if( somethingthatdoesnotexist ){
    somethingthatdoesnotexist();
  }
}
console.timeEnd('checking if a function exists');

// results:
// running an empty function: 0.103ms
// checking if a function exists: 0.036ms

在数量较少时,检查未定义的参数要快得多。

一旦测试次数增加,事情就会变得有趣。

// var timesTest = 100000;
// results:
// running an empty function: 1.125ms
// checking if a function exists: 1.276ms 

and

// results:
// var timesTest = 1000000000;
// running an empty function: 2096.941ms
// checking if a function exists: 2452.922ms 

随着测试数量的增加,运行空白函数的速度会稍微快一些。

我还没有尝试将其绘制在图表上,但我对这种行为很好奇。有人知道为什么吗?这对现实世界的代码有何影响?


  1. http://jsperf.com http://jsperf.com以获得更准确的基准测试和精美的图表。我做了一个:http://jsperf.com/empty-vs-check http://jsperf.com/empty-vs-check

  2. 这就是微观优化。没有人会注意到差异。十亿次迭代之间的差异不到半秒,这是永远不会发生的。做你认为更具可读性的事情;不用担心性能。

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

什么更快?运行空函数或检查函数是否未定义? [关闭] 的相关文章

  • Firebase 模拟器无法促进/运行新功能

    我有三个云功能 其中两个已部署到我的 firebase 项目中 其中一个是我刚刚添加的 我希望在部署之前在本地测试新的功能 但是当我尝试使用它时却无法使用 并且只有两个已部署的功能可用 Firebase 模拟器在端口上运行良好5001 像往
  • 如何设置黄瓜环境变量

    我有以下 package json name newcucumber version 1 0 0 main index js scripts test node modules bin cucumber js firefox node mo
  • 传单圆圈绘制/编辑问题

    我第一次制作传单 并面临绘制圆圈和编辑 更改圆圈位置 的问题 我面临的问题是 编辑 移动 圆从一个位置到另一位置会改变其半径 Note 请尝试在给定的小提琴中在地图顶部创建圆圈 然后通过单击编辑按钮将其移动到底部 如果我在地图的顶部创建圆圈
  • 确定用户是否在shadow dom之外单击

    我正在尝试实现一个下拉菜单 您可以单击外部将其关闭 下拉列表是自定义日期输入的一部分 并且封装在输入的影子 DOM 内 我想写一些类似的东西 window addEventListener mousedown function evt if
  • 可拖动的非模态弹出窗口 Jquery Mobile

    我希望在 Jquery mobile 中有一个弹出窗口 它不会阻止用户与页面交互 并且 data dismissible false 即当页面的另一部分与页面的另一部分交互并保持可见时 弹出窗口不会消失 我已经尝试过这个 popupNew
  • 递归链接 Promise

    我正在开发一个简单的 Windows 8 应用程序 我需要在其中从网站获取一组数据 我正在使用 WinJS xhr 来检索此数据 它返回一个 Promise 然后 我将回调传递到此 Promise 的 then 方法中 该方法为我的回调提供
  • Node.js 循环发送 http 请求

    我实际上遇到了使用 node js 执行的 javascript 代码的问题 我需要循环发送http请求到远程服务器 我在代码中设置了www google ca 这是我的代码 var http require http var option
  • 找到一系列间隔的最有效分组

    我有一个应用程序 其中有一系列不重叠的固定宽度间隔 每个间隔都有一个给定的键 每个间隔具有相同的宽度 并且可以存在连续的间隔 本质上 我想以最小化单独间隔的数量的方式对间隔和键进行分组 这可以通过合并具有相同键的连续间隔或查找匹配间隔并将它
  • 如何使用 Selenium webdriver 测试对 SVG 对象的点击?

    我正在尝试编写代码来检查单击 SVG 对象的功能 例如此 URL 上的美国州 http www amcharts com svg maps map usa 这可行 但是有更好的方法吗 不需要物理移动鼠标的东西 robert new Robo
  • 在流星收集加载时显示加载程序

    我有一个模板 task list 看起来像这样 each tasks gt task each Template task list tasks返回一个集合 在用户界面中 加载似乎需要一些时间 当集合正在加载时 我想显示一个加载指示器 关于
  • JQuery 验证不起作用

    我有一种表单 其中一个输入类型的值为 名字 但这可以在 onfocus 函数上更改我想验证此输入字段 如果它为空白或 名字 我有两个 jQuery 文件jquery 1 4 2 min js jquery validate pack js
  • 如何在 Web 应用程序中使用 Javascript 安全地访问 Windows Azure 移动服务?

    我需要一本 web javascript 安全入门书 根据如何使用 Windows Azure 移动服务的 HTML JavaScript 客户端 http www windowsazure com en us develop mobile
  • jqPlot DateAxis tickInterval 不起作用

    我试图每月绘制一个包含单个数据点的图表 我会在每个月的第一天将其作为一个点发送到 jqPlot jqplot actualChart 2011 10 01 0 296 2011 11 01 0 682 title programSelect
  • Chrome:window.print() 打印对话框仅在页面重新加载后打开 (javascript)

    我面临着一个非常奇怪的问题 我正在从 javascript 文件调用 window print 这在 Safari IE Firefox 中运行良好 直到两小时前 它在 Chrome 中也运行良好 版本29 0 1547 57 我没有更改我
  • 使用 Lodash 循环 JavaScript 对象中的属性

    是否可以循环访问 JavaScript 对象中的属性 例如 我有一个 JavaScript 对象定义如下 myObject options property1 value 1 property2 value 2 属性将动态添加到该对象 有没
  • 如何使用正则表达式解析 OCC 选项符号?

    OCC 选项符号由 4 部分组成 标的股票或 ETF 的根代码 用空格填充至 6 个字符 到期日期 6 位数字 格式为 yymmdd 期权类型 P 或 C 用于看跌或看涨期权 执行价格 为价格 x 1000 前面填充 0 至 8 位数字 举
  • java - 简单计算在多线程中比在单线程中花费更长的时间

    我试图了解如何利用多线程 我写了一个简单的程序来增加i 比方说 使用两种方式 400 000 次 单线程方式 0 到 400 000 和多线程方式 在我的例子中 4 次 0 到 100 000 线程数等于Runtime getRuntime
  • 为什么 JavaScript 默认导出不可用?

    为什么默认导出不像命名导出那样实时 lib js export let counter 0 export function incCounter counter export default counter main1 js import
  • 如何确定函数是否不返回任何内容?

    有没有办法在 PHP 中使用反射或其他方法来做到这一点 function a return null function b a a null b b null 如果您没有显式返回某些内容 则函数将返回null默认情况下 这就是 PHP 中函
  • 具有值的 TextInput 不会更改值

    在我的react native应用程序中 我有一个API 我从中检索数据 并且我在输入值中设置数据 用户应该能够编辑这些输入并更新 但是当我尝试输入输入时它不会输入任何内容并且值保持原样 这是 TextInput 代码

随机推荐

  • 如何在 postgresql 中基于 wCTE 的 upsert 中获取表的受影响行数?

    我需要你的帮助 我有一个包含 n 次插入和更新循环操作的查询 我决定使用 UPSERT 因为它不需要循环操作 ex WITH upsert AS UPDATE employee table SET rollno input rollno n
  • didRegisterForRemoteNotificationsWithDeviceToken - 推送通知

    我只是想确认 didRegisterForRemoteNotificationsWithDeviceToken 是指每次应用程序加载时都会调用 并且我的 PHP 服务器或应用程序需要处理是否重新提交以存储在我的数据库中 或者我缺少什么 谢谢
  • 如何改变图像的大小?

    我正在创建一款太空入侵者游戏 我希望所有图像都与屏幕分辨率成比例 这意味着它可以在所有屏幕尺寸上使用 并且所有图像都会缩小或变大 以便适合屏幕 游戏是全屏的 做到这一点最简单的技术是什么 这也是设置所有内容大小的最佳方法吗 你看过吗图像 g
  • Fedora 中的 Arduino 上传错误“stk500_recv(): 程序员没有响应”

    我正在尝试上传库存Blink在 Fedora Core 15 Linux 中使用 Arduino IDE 绘制草图 我收到此错误 avrdude stk500 recv 程序员没有响应 要重现该问题 通过 USB 线插入 Arduino U
  • 在 Task.Run 中使用 CancellationToken 超时不起作用[重复]

    这个问题在这里已经有答案了 好吧 我的问题很简单 为什么这段代码不抛出TaskCancelledException static void Main var v Task Run gt Thread Sleep 1000 return 10
  • Rails 3 Active Admin 将预设值添加到新记录

    我尝试从控制器和活动管理覆盖控制器执行此操作 但无法使其工作 用户创建一个网站 current user 有一个 id 属性 网站有一个 user id 属性 因此 当我创建一个新网站时 我想将 current user id 添加到 we
  • 如何作为用户无法查看的电子表格的“所有者”执行谷歌脚本

    希望这是一个非常简单的问题 我制作了一个 Google 脚本 可以写入单独的工作表 MasterSheet 中的单元格 这里有几个有用的问答帮助 这最终将部署嵌入到我提供给个人用户的多个不同工作表中 当用户对 MasterSheet 具有编
  • 如何更可靠地使用SerialPort类

    我一直在使用SerialPort在与我设计的一些外部硬件通信的应用程序中学习一段时间 在上述硬件的调试过程中 我发现了一些不可靠的地方 最近我偶然发现this http www sparxeng com blog software must
  • CURRENT_TIMESTAMP 和 GETDATE() 之间的区别[重复]

    这个问题在这里已经有答案了 有什么区别CURRENT TIMESTAMP and GETDATE 在 SQL Server 中 SELECT CURRENT TIMESTAMP GETDATE CURRENT TIMESTAMP是一个 AN
  • “标记”SVN 导出并进行修订

    我正在寻找以下情况的解决方案 我们使用 Subversion 除了使用签出的开发环境之外 我们还有一个测试环境 它应该尽可能类似于生产环境 因此 我们现在已将其设置为使用 SVN 导出来更新环境 但是 由于我们只想要最新版本 因此我们不知道
  • 如何在应用程序中将 NPM 模块与 Django 一起使用?

    我有一个包含 2 个应用程序的 Django 项目 我想在其中一个应用程序中使用 Notion API 因此我必须安装它的 NPM 模块 但是 我从未使用过 NPM 或捆绑器 我知道我必须使用一个用于导入语句 我不知道该怎么做 我应该在哪里
  • 如何始终在 api 平台 GET 操作中过滤特定字段值的集合?

    在 GET 操作中 我想从返回的集合中排除具有等于 true 的 archive 字段的实体 我希望它成为我的端点 例如 users 或 companies 的默认值 并且我想避免手动添加 URL 过滤器 例如 users filter a
  • boost::noncopyable 的 unordered_map 无法从操作符[]返回引用

    为了演示我的问题 请考虑这个无法编译的简单程序 include
  • 跨集群访问日志

    我有一个包含 3 个节点的集群 我已经配置了应用程序服务器的数据库 我想知道集群中各主机生成的访问日志是否相同 或者每个主机都有一个单独的 访问日志 用于记录对其主机的请求 我知道集群中的每个主机都维护自己的审核日志文件 访问日志的工作方式
  • 列表视图中的所有内容都会扩展到屏幕宽度。我可以改变这一点吗?

    我正在尝试为我正在制作的应用程序设计聊天屏幕 为了使其可滚动 我将所有聊天消息放置在列表视图中 但是我放置在列表视图中的所有内容都会水平扩展以匹配屏幕宽度 Listview 小部件的宽度 我可以关闭此功能 以便可以将我的聊天消息排列到一侧
  • 强制元类的只读属性

    是的 还在继续有了这个 https stackoverflow com questions 70729700 enforcing single instances from the metamodel 我的印象是 Raku 有这个强大的功能
  • 如何在 php 中安装 posix

    当我运行时 POSIX 没有出现php m cmd 然而 我从phpinfo enable posix shared在装有 Plesk 9 的 Linux 上 基本上我无法使用posix 功能如所述http www php net manu
  • 如何扩展pyserial的输入缓冲区大小

    我想通过串口与手机通信 向手机写入一些命令后 我使用了ser read ser inWaiting 得到它的返回值 但我总是得到总数1020 bytes字符 实际上 期望的回报应该已经结束50KB 我尝试过设置ser read 50000
  • 检测由 Tab 键启动的焦点?

    我想检测元素的焦点事件 但前提是该事件是由用户按 Tab 键启动的 例如
  • 什么更快?运行空函数或检查函数是否未定义? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在编写一些代码 其中作为参数传入的函数有时可能是未定义的 我很好奇这是一种不好的 做法 我想知道什么实际上更快 给出一个空函数 或者让函数检