Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 告诉不要问普林斯比使用了更多内存,如何做出妥协?_Php_Memory_Tell Dont Ask - Fatal编程技术网

Php 告诉不要问普林斯比使用了更多内存,如何做出妥协?

Php 告诉不要问普林斯比使用了更多内存,如何做出妥协?,php,memory,tell-dont-ask,Php,Memory,Tell Dont Ask,这说明整体使用情况好坏 doItBAD是不好的,因为传递一个对象对于函数来说是不必要的,但是内存是好的,因为它只传递一个引用,而不是整个数组本身 doItGOOD是好的,因为它只传递一个数组,而内存是坏的,因为它只传递所有数据的一个数组,而不是一个引用 现在如何决定使用哪一个呢?这是一个比简单地告诉别人不要问要广泛得多的问题。这里有两个概念。相互取舍是很常见的 优秀的软件设计 高效的软件设计 这两个概念都是主观的。关于什么构成好的代码,争论不休。高效软件根据上下文有多种不同的含义,例如:CPU高

这说明整体使用情况好坏

doItBAD是不好的,因为传递一个对象对于函数来说是不必要的,但是内存是好的,因为它只传递一个引用,而不是整个数组本身

doItGOOD是好的,因为它只传递一个数组,而内存是坏的,因为它只传递所有数据的一个数组,而不是一个引用


现在如何决定使用哪一个呢?

这是一个比简单地告诉别人不要问要广泛得多的问题。这里有两个概念。相互取舍是很常见的

优秀的软件设计 高效的软件设计 这两个概念都是主观的。关于什么构成好的代码,争论不休。高效软件根据上下文有多种不同的含义,例如:CPU高效或内存高效

因此,对这一问题的任何回答都是主观的,值得商榷。有人会说这不是一个好的堆栈溢出问题

什么时候为了效率而写更少的好代码

这就是经验

如果你没有这方面的经验,那么以下是一些建议:

这段代码对性能有多重要?它是每天执行一次还是每天执行十亿次,并发线程数为一百万? 演出的成功率有多高?不值得担心每天会损失1秒的CPU时间。不值得担心奇怪的内存KB。但是如果这个代码是500MB或1/2MB之间的差异,那么您可能应该仔细考虑一下。 你违反了多少原则?如果一个类中的9/10函数接受对象,而只有一个函数可以接受数组,那么您不太可能对代码进行那么多改进。你可能真的打破了规则。 开发时间。假设你的时间是每小时100美元?当一个不完美的答案可以在5分钟内完成时,找到这个问题的完美答案是否值得你花2小时的时间?有时候,答案是肯定的!。答案往往是否定的。 经验法则

坏:如果您没有性能要求,那么就不要担心性能。我花了太多的时间来修改那些人的代码。这是一个虚假的经济

更好:如果你没有具体的理由担心性能,那么不要。。。但在运行过程中测试性能。这样,当代码投入生产时,它实际上可能会工作

更清楚的是:以牺牲性能为代价追求好的设计。只有在您需要的时候才推动性能

class Operation
{
    private $op;

    public function __construct()
    {
        $this->op = [];
        for ($i = 1; $i < 1000; $i++)
        {
            $this->op[] = rand(1,9999);
        }
    }

    public function getOps()
    {
        return $this->op;
    }
}

class TestTellDontAsk
{
    public function doItBAD(Operation $op)
    {
        foreach($op->getOps() as $item)
        {
            echo $item.'; ';
        }
    }

    public function doItGOOD(array $ops)
    {
        foreach($ops as $item)
        {
            echo $item.'; ';
        }
    }
}

$m = [
    memory_get_peak_usage(true),
    memory_get_peak_usage(false),
    memory_get_peak_usage(true),
    memory_get_peak_usage(false)
];
$op = new Operation();
switch(mt_rand(0,1))
{
    case 0: (new TestTellDontAsk())->doItBAD($op); break;
    case 1: (new TestTellDontAsk())->doItGOOD($op->getOps()); break;
}
echo '<hr>';
echo memory_get_peak_usage(true) - $m[0].'<br>';
echo memory_get_peak_usage(false) - $m[1].'<br>';
echo memory_get_peak_usage(true) - $m[2].'<br>';
echo memory_get_peak_usage(false) - $m[3].'<br>';