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