这个问题可能是“有点”。但或多或少是微基础代码,但它是为了提高我的标准和PHP后端的一般知识。
SO!我走了,我的问题!调用变量两次比在PHP中调用其他条件需要更少的内存(和CPU上的负载)?哪个需要更多资源?为什么?
以下示例:
A ,显示调用变量两次, B ,显示调用另一个其他条件。 当然,两者都有相同的最终结果。
对任何答案(响应)的任何其他引用也将被高度挪用!如果可能的话。
示例A:
$a = 1;
if (isset($array['a']))
{
$a = $array['a'];
}
$b = NULL;
if (isset($array['b']))
{
$b = $array['b'];
}
示例B:
if (isset($array['a']))
{
$a = $array['a'];
}
else
{
$a = 1;
}
if (isset($array['b']))
{
$b = $array['b'];
}
else
{
$b = NULL;
}
答案 0 :(得分:3)
我觉得这两个生成的PHP操作码对于大多数当前版本的php来说都是相同的或等效的。自己玩,看看:http://blog.ircmaxell.com/2012/07/the-anatomy-of-equals-opcode-analysis.html
为了好玩,这里是通过php 5.3x生成的操作码,例如A:
2 0 > ASSIGN !0, 1
3 1 ZEND_ISSET_ISEMPTY_DIM_OBJ 1 ~1 !1, 'a'
4 2 > JMPZ ~1, ->6
5 3 > FETCH_DIM_R $2 !1, 'a'
4 ASSIGN !0, $2
6 5 > JMP ->6
8 6 > ASSIGN !2, null
9 7 ZEND_ISSET_ISEMPTY_DIM_OBJ 1 ~5 !1, 'b'
10 8 > JMPZ ~5, ->12
11 9 > FETCH_DIM_R $6 !1, 'b'
10 ASSIGN !2, $6
12 11 > JMP ->12
13 12 > > RETURN 1
以下是例B:
2 0 > ZEND_ISSET_ISEMPTY_DIM_OBJ 1 ~0 !0, 'a'
3 1 > JMPZ ~0, ->5
4 2 > FETCH_DIM_R $1 !0, 'a'
3 ASSIGN !1, $1
5 4 > JMP ->6
8 5 > ASSIGN !1, 1
11 6 > ZEND_ISSET_ISEMPTY_DIM_OBJ 1 ~4 !0, 'b'
12 7 > JMPZ ~4, ->11
13 8 > FETCH_DIM_R $5 !0, 'b'
9 ASSIGN !2, $5
14 10 > JMP ->12
17 11 > ASSIGN !2, null
19 12 > > RETURN 1
您处理的代码行数相同,分配数量和跳转次数相同。你只是略微不同,但是快速浏览一下,看起来唯一的区别是执行的顺序,而不是执行的实际命令。
答案 1 :(得分:1)
我还没有计时,但其他方面没有评价。如果你有一个elseif,可能会有一些无限小的差异。这个例子可能归结为可读性和/或编码偏好。
答案 2 :(得分:1)
我创建了一个迷你基准测试,看看哪个更快。 以下评估两个函数正好100次。 在这两个函数中,他们对您的示例进行了100,000次评估。 在我的家庭Ubuntu Web服务器上,输出类似于此。
6.0754749774933 =赋予变量默认值。
4.8433840274811 =改为使用else语句。
第二个例子(else语句)快两秒,但是这个例子正在执行10,000,000(1000万)次。在现实生活中的例子中,代码的可读性以及团队喜欢的内容比节省几毫秒更重要。
要回答您的问题,使用任何一种方法时差异几乎为零。
如果你想要我的意见,我更喜欢第二个例子。
这是我使用的基准测试代码。 http://phpfiddle.org/api/raw/8nm-d72
答案 3 :(得分:1)
忽略最小的性能差异,最好先定义一个变量。
PHP不是类型安全的(但是),但是,假设您的示例B 导致2种不同类型的变量$ a。
if (isset($array['a']))
{
$a = $array['a']; // could be a string or anything else
}
else
{
$a = 1; // is an integer
}
对于可能很容易成为问题的进一步代码中的严格条件。
例如:假设$array['a']
的值为'1'
;
以下fould失败:
if ( $a === 1 ) // do something
此处的类型和值必须匹配TRUE
仅适用于上述其他情况$a = 1;