【问题标题】:Objects in PHP: More or Less is better?PHP 中的对象:更多或更少更好?
【发布时间】:2010-01-04 21:19:26
【问题描述】:

我之前问过 aqbout 时区和日期/时间,但这是一个更具体的问题,更多关于 PHP 中的对象。

<?PHP
//set the user's time zone on page load
date_default_timezone_set("America/Los_Angeles");

//convert the timestamp from DB into the user's time
$timestamp = '2008-05-01 13:44:19'; //this would normally be returned from mysql
echo ConvertDateTime($timestamp, "America/Los_Angeles");

//here is the function to convert it
function ConvertDateTime($timeString, $timeZone)
{
    if ( $d = new DateTime($timeString) ) {
        $d-&gt;setTimeZone(new DateTimeZone($timeZone));
        return $d-&gt;format("Y-m-d H:i:s");
    }
    return null;
}
?>

好吧,这对某些人来说可能是一个愚蠢的问题,但我对类和对象真的了解不多,也没有太多经验,通常在一个页面上,例如,我将创建 1 个数据库对象并运行每个 mysql 查询具有该 1 个对象集的页面。我一直认为更少的对象可能更好,但我在这个网站上读到,与 1 个对象相比,拥有数百个对象的速度和使用的资源相同,不确定是否属实。

我的问题,在上面的函数中,您可以看到每次调用函数时都会创建一个新的 DateTime 对象,在我的情况下,在某些页面上可能会创建 100 次。那么我应该像单例一样使用,甚至可以在设置数据库对象的标头中设置一个 dattim 对象 1 次,还是应该让函数创建大量对象?

请解释利弊以及我可能应该做的事情,感谢任何建议,有些人可能会说我正在预先优化,我已经优化了 2 年多的当前网站,以便将它放在我想要的地方,现在我正在重建那个相同的网站,所以我有点知道预期的用户负载和内容,我宁愿现在而不是以后修复类似的东西。

【问题讨论】:

    标签: php mysql datetime object


    【解决方案1】:

    我应该像单例一样使用

    Singleton 并非没有问题——例如,它们经常使(自动化)测试变得困难。这是“大”框架较少和喜欢它们的原因之一(我正在考虑 Zend 框架和 Symfony,它们正在减少下一个主要版本的 Singleton 数量)


    我可以设置一个 dattim 对象 1 次 标题

    使用全局变量/对象也有副作用;如果一个变量是“本地的”,它应该是本地的——代码的可读性和理解它的能力通常比几分之一毫秒更重要。


    对于极端和特定的情况,唯一的(true) 解决方案是分析:您希望您的脚本/应用程序运行得更快吗?要使用更少的 CPU 吗?

    然后,首先,剖析它!这将有助于识别瓶颈 - 并向您展示您应该专注于什么。

    您可能有很多可以最快优化的东西(即,这将花费更少的时间来思考、编码和测试)——并且会让您获得更高的性能提升。 p>


    最后,你总是要在以下两者之间做出选择:

    • 最好的表现
    • 开发/优化某些东西所需的时间
    • 维护它所需的时间;包括您以外的其他人。

    而且,通常情况下,一台新的、更强大的服务器(或第二台)最终将花费不到几周的时间进行优化,从而只获得 5% 的收益!

    (注意我不是说你不应该优化;但你不应该过度优化。)

    【讨论】:

    • 除了做测试和其他东西,我想我想知道只使用 1 个对象是不是很糟糕?我有时会看到人们使用大量对象,但我看不到原因,但我对对象很陌生,所以可能有原因,我只是不知道它是什么?
    • @jasondavis :如果使用多个对象比仅使用 1 个对象更有意义,那么仅使用一个对象是“坏的”:通常重要的是您的代码有意义。 ;;你通常真的不需要过度优化你的代码:你的时间比你可能(或没有)通过这种优化获得的 1% 或 2% 的 CPU 更重要(并且成本更高,当你得到报酬时) . ;;在 2 天内获得 25% 的 CPU 非常棒(一个“简单”的想法,通常是“缓存”);;在 10 天内获得 1 毫秒通常是不值得的。
    【解决方案2】:

    我一直认为物品越少越好 可能更好,但我已经读过 这个网站有数百个 物体将以相同的速度和 与 1 个对象相比使用的资源, 不知道是真是假。

    额外的对象需要额外的内存空间 - 因此您可以假设操作路径会产生影响(但是,它们可能不明显/需要您采取行动)。

    你可以看到每次创建一个新的 DateTime 对象 函数被调用,可能是 100 次 在我的情况下的某些页面上。所以 我应该像单例一样使用

    是的,您可以使用单例 - 或缓存页面的结果(您是在同一页面上显示多个不同的时间 - 还是在许多地方显示相同的计算时间?)

    【讨论】:

    • 嗨,现在不同了,缓存几乎是不可能的或不值得的,因为它是一个大型社交网站,会有数千个缓存,实际上可能有数百万个页面
    【解决方案3】:

    在这种情况下,每次调用函数时创建一个新对象不会产生太多额外的内存使用:每次离开函数时,都会释放内存。

    如果您使用完全相同的 $timeString 和 $timeZone 多次调用该函数,您可能需要添加结果缓存。如果大多数调用都是唯一的,我不会添加缓存:它可能会帮助您提高速度,但存储所有结果而不重用它们会浪费内存。

    【讨论】:

    • 是的,这将是不同的时间,我非常想在我的示例中找出是否应该在一个页面上为 100 个不同时间执行 1 个对象或 100 个对象
    • 如果时间戳和时区在每次调用时都可能发生变化,那么您需要为每一个遗憾的内容进行更改。如果其中一个是恒定的,那么它是一个较小的域空间,并且可能是其他选项,因为我说了一些关于它的内容,所以您实际上可能的结果只有时间部分的数字 86400,可以通过使用时区之间的偏移量进行查找来处理。可能会尝试以不同的方式看待问题,它会自行解决。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-16
    • 2012-07-01
    • 2019-01-08
    相关资源
    最近更新 更多