公平地说,这取决于您拥有什么样的数据。其他答案的结果(或多或少)*正确。为了清楚起见,我将在底部粘贴测试代码。
这里重要的是,如果您使用预定义的对象,您可以节省相当多的内存,权衡是您需要定义确切的结构。
考虑以下测试结果:
static obj: 0.04223108291626
memory: 164920
object(staticSet)#1 (3) {
["aaa"]=>
string(3) "aaa"
["bbb"]=>
string(3) "bbb"
["ccc"]=>
string(6) "aaabbb"
}
---------------------------------------
static obj with an additional prop: 0.042968988418579
memory: 524920
object(staticSet2)#1000 (3) {
["aaa"]=>
string(3) "aaa"
["bbb"]=>
string(3) "bbb"
["ddd"]=>
string(6) "aaabbb"
}
---------------------------------------
我在这里可能错了,我没有查看 PHP 源代码,但我相信就 PHP 而言,一切都是数组。预定义的对象只是一个定义良好的数组。一个有趣的说明是值类型没有效果,即。字符串值 '1' 将占用与布尔值 true 相同的内存量。
为什么?正如我之前所说,PHP 是数组,所以如果你有一个带有 setter 函数的对象(简化版),PHP 的作用是:
$objects = ['objectName' => [
'aaa' => '',
'bbb' => '',
'ccc' => '',
'setValue:f' => function('name', 'value') { ... }
]
];
每次执行时,都会查找用于查找道具名称的功能键,以及在后台对道具类型等进行任何验证。预定义对象中的内存节省来自于定义一个设定长度的数组(否则在 PHP 中是不可能的),而不是分配一块内存。
结论:
静态对象:耶!我们节省内存!但是如果你尝试在定义之外添加任何东西,它会变得比 stdClass 更大。
['aaa'] into [['aaa'],['bbb']]
数组:如果你用 PHP 编写你最好喜欢它们,即使是字符串也是 PHP 中的字符数组。
对象:对象具有很酷的功能,它们是保持代码有条理、干净、模块化的好方法。但众所周知,“拥有强大的力量……”。
最后,我的测试代码和“*”。人们似乎忘记了,如果您在脚本运行时不清理变量,它们将保留在内存中,虽然它不会影响执行时间(很多),但会影响内存测量。所以在运行内存分析时 unset() 是你的朋友。
<?php
error_reporting(E_ALL);
ini_set('display_errors',1);
$noOfObjects = 1000;
$noOfOperations = 1000;
class set {
public function setKey($key, $value) {
$this->{$key} = $value;
}
public function readKey($name) {
return $this->{$name};
}
}
class staticSet {
public string $aaa;
public string $bbb;
public string $ccc;
}
class staticSet2 {
public string $aaa;
public string $bbb;
}
class staticSet3 {
public bool $aaa;
public bool $bbb;
public bool $ccc;
}
$arraysOf=[];
$t0 = microtime(true);
$start=memory_get_usage();
for ($i=0; $i<$noOfObjects; $i++) {
$z = array(); // definition
for ($j=0; $j<$noOfOperations; $j++) {
$z['aaa'] = 'aaa';
$z['bbb'] = 'bbb';
$z['ccc'] = $z['aaa'].$z['bbb'];
}
$arraysOf[]=$z;
}
$end=memory_get_usage();
echo 'arrays: '.(microtime(true) - $t0).PHP_EOL;
echo 'memory: '.($end-$start).PHP_EOL;
var_dump($z);
unset($t0,$start,$end,$z,$arraysOf);
echo '---------------------------------------'.PHP_EOL;
$arraysOf=[];
$t0 = microtime(true);
$start=memory_get_usage();
for ($i=0; $i<$noOfObjects; $i++) {
$z = new set(); // definition
for ($j=0; $j<$noOfOperations; $j++) {
$z->setKey('aaa','aaa');
$z->setKey('bbb','bbb');
$z->setKey('ccc',$z->readKey('aaa').$z->readKey('bbb'));
}
$arraysOf[]=$z;
}
$end=memory_get_usage();
echo 'dynamic obj: '.(microtime(true) - $t0).PHP_EOL;
echo 'memory: '.($end-$start).PHP_EOL;
var_dump($z);
unset($t0,$start,$end,$z,$arraysOf);
echo '---------------------------------------'.PHP_EOL;
$arraysOf=[];
$t0 = microtime(true);
$start=memory_get_usage();
for ($i=0; $i<$noOfObjects; $i++) {
$z = new staticSet(); // definition
for ($j=0; $j<$noOfOperations; $j++) {
$z->{'aaa'} = 'aaa';
$z->{'bbb'} = 'bbb';
$z->{'ccc'} = $z->{'aaa'}.$z->{'bbb'};
}
$arraysOf[]=$z;
}
$end=memory_get_usage();
echo 'static obj: '.(microtime(true) - $t0).PHP_EOL;
echo 'memory: '.($end-$start).PHP_EOL;
var_dump($z);
unset($t0,$start,$end,$z,$arraysOf);
echo '---------------------------------------'.PHP_EOL;
$arraysOf=[];
$t0 = microtime(true);
$start=memory_get_usage();
for ($i=0; $i<$noOfObjects; $i++) {
$z = new staticSet2(); // definition
for ($j=0; $j<$noOfOperations; $j++) {
$z->{'aaa'} = 'aaa';
$z->{'bbb'} = 'bbb';
$z->{'ddd'} = $z->{'aaa'}.$z->{'bbb'};
}
$arraysOf[]=$z;
}
$end=memory_get_usage();
echo 'static obj with an additional prop: '.(microtime(true) - $t0).PHP_EOL;
echo 'memory: '.($end-$start).PHP_EOL;
var_dump($z);
unset($t0,$start,$end,$z,$arraysOf);
echo '---------------------------------------'.PHP_EOL;
$arraysOf=[];
$t0 = microtime($noOfObjects);
$start=memory_get_usage();
for ($i=0; $i<$noOfObjects; $i++) {
$z = new Ds\Map(); // definition
for ($j=0; $j<$noOfOperations; $j++) {
$z->put('aaa','aaa');
$z->put('bbb','bbb');
$z->put('ccc',$z->get('aaa').$z->get('bbb'));
}
$arraysOf[]=$z;
}
$end=memory_get_usage();
echo 'Ds\Map: '.(microtime(true) - $t0).PHP_EOL;
echo 'memory: '.($end-$start).PHP_EOL;
var_dump($z);
unset($t0,$start,$end,$z,$arraysOf);
echo '---------------------------------------'.PHP_EOL;
$arraysOf=[];
$t0 = microtime(true);
$start=memory_get_usage();
for ($i=0; $i<$noOfObjects; $i++) {
$z = new staticSet(); // definition
for ($j=0; $j<$noOfOperations; $j++) {
$z->{'aaa'} = '1';
$z->{'bbb'} = '1';
$z->{'ccc'} = ($z->{'aaa'} && $z->{'bbb'});
}
$arraysOf[]=$z;
}
$end=memory_get_usage();
echo 'static obj with bool values: '.(microtime(true) - $t0).PHP_EOL;
echo 'memory: '.($end-$start).PHP_EOL;
var_dump($z);
unset($t0,$start,$end,$z,$arraysOf);
echo '---------------------------------------'.PHP_EOL;
$arraysOf=[];
$t0 = microtime(true);
$start=memory_get_usage();
for ($i=0; $i<$noOfObjects; $i++) {
$z = new staticSet3(); // definition
for ($j=0; $j<$noOfOperations; $j++) {
$z->{'aaa'} = '1';
$z->{'bbb'} = '1';
$z->{'ccc'} = ($z->{'aaa'} && $z->{'bbb'});
}
$arraysOf[]=$z;
}
$end=memory_get_usage();
echo 'static obj with defined bool values: '.(microtime(true) - $t0).PHP_EOL;
echo 'memory: '.($end-$start).PHP_EOL;
var_dump($z);
unset($t0,$start,$end,$z,$arraysOf);
echo '---------------------------------------'.PHP_EOL;
$arraysOf=[];
$t0 = microtime(true);
$start=memory_get_usage();
for ($i=0; $i<$noOfObjects; $i++) {
$z = array('aaa' => '','bbb' => '','ccc' => ''); // definition
for ($j=0; $j<$noOfOperations; $j++) {
$z['aaa'] = 'aaa';
$z['bbb'] = 'bbb';
$z['ccc'] = $z['aaa'].$z['bbb'];
}
$arraysOf[]=$z;
}
$end=memory_get_usage();
echo 'predefined array: '.(microtime(true) - $t0).PHP_EOL;
echo 'memory: '.($end-$start).PHP_EOL;
var_dump($z);
unset($t0,$start,$end,$z,$arraysOf);
echo '---------------------------------------'.PHP_EOL;
echo 'phpversion '.phpversion().PHP_EOL;