【问题标题】:PHP Performance (Read Configuration)PHP 性能(读取配置)
【发布时间】:2014-05-24 12:59:54
【问题描述】:

我想知道使用 PHP 在使用内存空间和缩短响应时间方面哪个更有效。

下面是代码:

解决方案01:每次从磁盘读取

<?php

class Resource
{

    // I know, but forget about validation and other topics like if isset($key) ... 
    public static function get($key)
    {
        $array = json_decode(static::getFile());
        return $array[$key];
    }

    // Imagine the get.json file has a size of 92663KB and is compress
    private static function getFile()
    {
        return file_get_contents('/var/somedir/get.json');
    }

}

解决方案02:将文件配置存储在类的属性中

<?php

class Resource
{
    // This will be a buffer of the file
    private static $file;

    public static function get($key)
    {
        static::getFile();

        $array = json_decode(static::$file);
        return $array[$key];
    }

    // Imagine the get.json file has a size of 151515KB now and is compress
    private static function getFile()
    {
        if (!is_null(static::$file)) {
            static::$file = file_get_contents('/var/somedir/get.json');
        }

        return static::$file;
    }

}

现在想象一下哪个用户要求 myapp.local/admin/someaction/param/1/param/2 并且这个动作消耗了 9 个大小分别为 156155KB、86846KB、544646KB、8446KB 的配置文件, 787587587KB等

  1. 哪种解决方案更有效?
  2. 还有其他最好的方法吗?
  3. 还有其他文件格式吗?
  4. 也许使用 PHP 数组而不是 json 文件和解析?

【问题讨论】:

  • 没有办法回答这个问题。如果您将此代码代码调用一次,那么缓存就是浪费时间。如果您多次调用此代码,那么您必须权衡吸收大量内存以保存缓存数据,v.s.每次加载/解码 json 文件的时间节省。至于数组v.s。 json,请记住,一旦您解码 JSON,它就会变成 PHP 数组/字符串/对象/无论如何。

标签: php performance caching configuration


【解决方案1】:

这是一个经典的时间与空间权衡。没有通用的答案,只有获得答案的好习惯。

经验法则:

  1. 磁盘 IO 很慢。解密和/或解压缩消耗周期。避免这种类型的重复工作通常会使程序运行得更快。

  2. 但是缓冲需要 RAM。 RAM 是一种有限的资源。使用 RAM 会加载处理器缓存。大量使用 RAM 会加载 VM 系统。两者都会导致减速,从而部分地避免避免磁盘 I/O。在极端情况下,加载 VM 系统会导致与磁盘进行交换,因此缓冲导致磁盘 IO。

经验法则完成后,您必须使用良好的工程实践。

  1. 确定可用于在内存中保存磁盘数据的内存量。
  2. 确定从磁盘重复读取哪些结构以及频率。
  3. 确定它们的大小。
  4. 选择一个有意义的集合:具有最高值的那些

    (每个字节的 IO 时间 + 每个字节的解压缩/解密时间)x FrequencyOfReads x 字节大小

    也适合可用的 RAM。

  5. 按照您的建议实现 4. 的缓存。

  6. 轮廓和测量。尝试替代方案。根据需要重复。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-05
    • 1970-01-01
    • 2022-07-06
    • 1970-01-01
    • 2012-08-02
    • 2014-01-24
    • 2011-11-23
    • 2015-03-13
    相关资源
    最近更新 更多