我正在做一些大型的时间戳列表迭代:将它们放入 带日期范围的表, ,并通过范围对它们进行分组。为此,我发现 strtotime() 一个非常有用的功能,但我担心它 表现.

例如,一个在周列表中循环的功能(例如,第49周至05周),必须决定本周结束时的时间戳和时间戳。一种有用的方法是:

foreach ($this->weeks($first, $amount) as $starts_at) {
  $ends_at = strtotime('+1 week', $starts_at);
  $groups[$week_key] = $this->slice($timestamps, $starts_at, $ends_at);
}

//$this->weeks returns a list of timestamps at which each week starts.
//$this->slice is a simple helper that returns only the timestamps within a range, from a list of timestamps. 

代替 strtotime(), ,我可能会找出一周开始到结束之间的秒数,其中99%的时间 24 * 60 * 60 * 7. 。但是在这些极少数情况下,有一个DST开关的情况,24应该是23或25。 strtotime(), , 不是?

我使用相同的模式在数年,几个月(几个月,非常不一致!),几天和小时。我只有几个小时才能只是添加 3600 到时间戳更快。

还有其他陷阱吗?是否有(不依赖于php5.3!)可以提供更好的路线,以使一致,DST和LEAP年安全的途径有更好的路线?

有帮助吗?

解决方案

您为什么担心它的表现?您是否有证据表明它正在减慢您的系统?如果没有,则由于不必要的原因,不要试图过度调整解决方案。记住这一点 premature optimization is the root of all evil. 。编写有意义的可读代码,并且只有在您知道这将是一个问题的情况下才能优化...

但是要考虑的其他事情是它也已编译为C代码,因此对于它的作用应该非常有效。您也许可以在PHP土地中构建代码的子集合,并使其更快,但是这将是一项艰巨的工作(由于PHP代码中涉及的所有开销)。

就像我之前说过的,请使用它,直到证明这是一个问题,然后解决该问题。不要忘记重写它,因为您的需求也不是免费的。它需要时间并引入错误。如果收益最小(这意味着这不是一个绩效问题),这是值得的。因此,除非您知道这是一个问题,否则不要费心尝试微优化...

其他提示

为了回答这个问题,最终:

基于这样的许多基准: https://en.code-bude.net/2013/12/19/benchmark-strtotime-vs-datetime-vs-vs-ves-gettimestamp-in-php/

我们可以看到 strtotime() 我们能想到的更有效。因此,是的,要将字符串转换为时间戳,strtotime函数 表现不错.

非常有趣的问题。我会说,您真正弄清楚这一点的唯一方法是设置自己的绩效测试。在脚本的开头和结尾观察Microtime()的值,以确定性能。通过一种方法,然后通过一种方法运行一个荒谬的值,然后是另一种方法。比较时间。

我知道这可能不是您要寻找的答案,但最好的选择是 分析 它是 真实用例 心里。

我的本能是,正如您所想的那样 strtotime 会慢。但是,即使是慢了3倍,这在上下文中只是有意义的。也许您的例程使用真实数据使用STRTOTIME需要60毫秒,因此在大多数情况下,您只会节省40毫秒(我完全弥补了这些数字,但是您明白了)。因此,您可能会发现,优化这一点不会真正获得回报(考虑到您正在为更多潜在的错误打开代码,因此您必须花更多的时间才能正确处理它)。

顺便说一句,如果您拥有良好的分析工具,那么很棒,但是即使您没有比较时间戳,也应该给您一个大概的想法。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top