代码之家  ›  专栏  ›  技术社区  ›  berkes

phps strtotime()的性能如何?

  •  1
  • berkes  · 技术社区  · 14 年前

    我正在进行一些大型时间戳列表迭代:将它们放入 tables with date-ranges ,并按范围对它们进行分组。 为了做到这一点,我发现 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. 
    

    而不是 SttoTimes() 我可能会找出一周开始和结束之间的秒数,99%的时间 24 * 60 * 60 * 7 . 但在这些罕见的有DST开关的情况下,24应该是23或25。整理代码,可能会慢很多 SttoTimes() 不是吗?

    我在年、月(月,非常不一致)的范围内使用相同的模式!,天和小时。只有几个小时我才会怀疑 3600 到时间戳更快。

    还有其他的吗?有没有办法(不依赖php5.3!)这为一致性、DST和闰年安全日期范围提供了更好的路线?

    4 回复  |  直到 7 年前
        1
  •  10
  •   ircmaxell    14 年前

    你为什么担心它的性能?你有证据表明它正在减慢你的系统吗?如果没有,不要因为不必要的原因试图过度复杂化解决方案。记住 premature optimization is the root of all evil . 编写有意义的可读代码,并且只有当您知道这将是一个问题时才进行优化…

    但需要考虑的是,它也编译了C代码,因此对于它所做的工作来说应该是相当有效的。您可能能够在php land中构建代码的子集并使其更快,但这将是一项困难的工作(由于php代码中涉及的所有开销)。

    就像我之前说的,使用它直到你证明它是一个问题,然后解决那个问题。别忘了为你的需要重新写也不是免费的。这需要时间并引入错误。如果增益最小,是否值得(这意味着从一开始就不是性能问题)。所以不要费心去尝试微观优化,除非你知道这是个问题…

        2
  •  1
  •   Matpo    7 年前

    最后回答问题:

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

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

        3
  •  0
  •   Ricky    14 年前

    很有趣的问题。我要说的是,唯一能真正弄清楚这一点的方法是建立自己的性能测试。在脚本的开头和结尾观察microtime()的值,以确定性能。用一个方法,然后用另一个方法,在一个循环中运行大量的值。比较时间。

        4
  •  0
  •   Juan Pablo Califano    14 年前

    我知道这可能不是你想要的答案,但你最好的选择是 仿形 它与 实际用例 铭记在心。

    我的直觉是,正如你所想, strtotime 会变慢。但是,即使它慢了3倍,这只在上下文中有意义。也许你的程序,有真实的数据,使用strtotime需要60毫秒,所以在大多数情况下,你只需要节省40毫秒(我完全编造了这些数字,但你明白了)。因此,您可能会发现,优化这一点并没有真正的效果(考虑到您要将代码开放给更多潜在的bug,并且您需要投入更多的时间来纠正它)。

    顺便说一下,如果你有好的分析工具,很棒,但是即使你不比较时间戳,也应该给你一个大致的想法。