【问题标题】:What is the max time a function call should take to run in 2015?函数调用在 2015 年运行的最长时间是多少?
【发布时间】:2016-01-05 17:04:35
【问题描述】:

我有一个功能需要在每次按键时运行,我想知道它是否做太多工作。为了弄清楚这一点,我会计时。如果它小于一毫秒,我将不得不对其进行迭代 1k - 100 万次,然后除以该数量。

虽然这看起来很笼统,但我还是要问,一个函数在 2015 年运行的最长时间应该是多少?有没有标准?

在视频游戏中,如果您想达到每秒 30 帧,那么您有 33 毫秒的时间可以玩,因为 1 秒等于 1000 毫秒,而 1000 毫秒/30 帧每秒等于 33 毫秒。如果您的目标是每秒 60 帧,那么您只有 15 毫秒的时间可以使用。那么在什么时候你会对你的软件开发人员说他们的功能需要太长时间呢?之后,1毫秒? 100 毫秒?

例如,如果您要使用 JQuery 在包含 1000 个元素的页面上查找一个元素,该函数需要多长时间? 100 毫秒太长了吗? 1毫秒太长了吗?人们用什么标准去遵守?我听说数据库管理员对查询有标准的搜索时间。

更新:
我真的不知道如何按照我的意思来表达这个问题。我问的原因是因为我不知道是否需要优化功能或继续前进。如果我对一个函数计时,我不知道它是快还是慢。因此,如果它小于一毫秒,我将忽略它,如果它长于一毫秒,我将继续处理它。

更新 2:
我找到了一个描述场景的帖子。查看this 问题中的数字。查询数据库需要 3ms。如果我是数据库管理员,我想知道扩展至一百万用户是否需要很长时间。我想知道在添加另一台服务器以帮助负载平衡之前 连接到数据库或执行查询需要多长时间。

【问题讨论】:

  • 对我来说没有限制。你的函数永远不会返回。但对其他人来说,我认为执行得越快越好……
  • 我得出的结论是,如果它不到一毫秒,我不会担心它。如果它需要更长的时间,我会重构它。顺便说一句,我可以使用的分析工具仅以毫秒精度进行测量。因此,当我在调用之前调用 getTimer() 并在调用之后调用 getTimer() 时,它可能会将时间差显示为零。

标签: performance load-balancing performance-testing database-performance


【解决方案1】:

好的。我想你问错问题了。或者也许以不太可能产生有效结果的方式思考问题。

绝对没有规则说“你的函数应该在不超过 X 毫秒后返回”。有许多强大的 Web 应用程序使用可能在 250 毫秒内不会返回的函数。这可能没问题,具体取决于上下文。

而且,请记住,在您的开发机器上运行 3 毫秒的函数可能在其他人的机器上运行得更快或更慢。

但这里有一些提示可以让您更清晰地思考:

1) 一切以用户为中心。 真的(我有点犹豫要不要这么说,因为有人会太从字面上理解我,要么写出糟糕的代码,要么与我开始一场激烈的战争),但只要你的代码性能不影响用户体验,您的功能可以根据您的需要执行。我并不是说您应该在代码优化中偷懒;我的意思是,只要用户没有察觉到任何延迟,您就不需要真的为此感到压力。

2) 问自己两个问题: a) 函数多久运行一次? b) 它将快速连续运行多少次,中间没有中断(即它会循环运行)?

在您每次用户键入键时调用函数的示例中,您可以根据用户执行的频率来决定“完成一个函数需要多长时间”击键。同样,如果它不关心用户有效使用您的应用程序的能力,那么您就是在浪费超过 3 毫秒的讨价还价时间。

另一方面,如果要在运行 100,000 次的循环中调用您的函数,那么您肯定希望花一些时间使其尽可能精简。

3) 在适当的情况下使用承诺。 Javascript promises 是一个不错的功能(尽管它们不是 javascript 独有的)。 Promise 的意思是,“听着,我不知道这个功能要花多长时间。我去开始工作吧,我会在我完成时通知你。”然后,您的其余代码可以继续执行,并且无论何时履行承诺,您都会收到通知,并且可以在此时执行某些操作。

Promise 最常见的例子是 AJAX 设计模式。你永远不知道调用后端可能需要多长时间,所以你只需要说“好吧,当后端响应一些有用的信息时告诉我”。

Read more about promises here

4) 为乐趣和利润进行基准测试 如上所述,有时您确实需要在最后的悲惨毫秒中剃掉。在这些情况下,我发现jsperf.com 非常有用。他们可以轻松快速地测试两段代码,看看哪一段运行得更快。还有很多其他的基准测试工具,但我非常喜欢那个。 (我意识到这与原始帖子有点相切,但在某些时候其他人会花很长时间阅读这篇文章,所以我觉得它是相关的)

说到底,记得把这个问题与用户联系起来。为用户优化,而不是为你的自我或任意数字优化。

【讨论】:

  • 谢谢。你得到了我想要问的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
  • 1970-01-01
  • 2023-01-17
  • 2019-04-27
  • 1970-01-01
相关资源
最近更新 更多