是否可以告诉 php 解释器忽略代码块?
Is it possible to tell the php interpreter to ignore code blocks?
背景
在我进行 C 编程的那一天,我们使用 assume 语句来确保代码是健康的。类似于:
aFunction(int hello)
{
assume(hello < 10);
assume 语句最酷的地方在于,它被定义为用于发布编译的空宏和用于调试编译的 die on false 语句。因此,开发人员拥有 assert 语句检查他们的假设的所有好处,而不会导致不必要的错误或影响
中的性能
问题
现在我正在工作 php 我正在寻找类似的机制。我目前的 assume 语句看起来像这样:
define(DEBUG, getenv('debug'));
function assume($a)
{
if (DEBUG && !$a)
{
echo 'ASSUME FAILURE <br />';
echo '<pre>';
print_r(debug_backtrace());
die('<pre>');
}
}
assume($a == $b);
如您所见,我在服务器设置中设置了调试标志,以删除实际的 die 语句等。然而,函数调用仍然执行并且 if 语句仍然被评估。如果它只出现几千次,这没什么大不了的,但是随着代码变得越来越大,并且随着这些假设进入循环,这可能会对性能产生合理的影响。
问题
有没有办法告诉解释器或 opcache(我目前正在使用 php 5.5 中包含的 zend opcache)完全忽略这些假设语句?或者有其他方法可以解决这个问题吗?
区别在于C编译器经过优化,可以剔除不用的代码块。在PHP中,assume
是函数调用,函数必须存在
几个解决方案。首先,您可以使用 assert()
。 assert
函数的工作方式类似于您自己的 assume
函数。如果断言失败,则调用定义的断言处理程序。您可以轻松启用或禁用断言,如果禁用它们,则根本不会调用断言处理程序。
如果你想继续你自己的assume
函数,你仍然可以稍微优化一下,通过根据定义声明函数:
<?php
define(DEBUG, getenv('debug'));
if (DEBUG) {
function assume($a) {
echo 'ASSUME FAILURE <br />';
echo '<pre>';
echo print_r(debug_backtrace());
die('<pre>');
}
} else {
function assume($x) {}
}
这样,您实际上将 assume
声明为一个空函数。 Michael Berkowski 的评论证实了我的担心 PHP 并没有完全消除调用,但至少你保存了 if
.
另一个解决方案是调用稍微复杂一点的假设:
DEBUG && assume($x < 10);
这样,如果 DEBUG 为假,则根本不会进行调用。这样只计算布尔值,不调用函数。当然,以这种方式调用它有点困难且可读性较差,但我认为不调用函数的节省比消除 if
.
要重要得多
背景
在我进行 C 编程的那一天,我们使用 assume 语句来确保代码是健康的。类似于:
aFunction(int hello)
{
assume(hello < 10);
assume 语句最酷的地方在于,它被定义为用于发布编译的空宏和用于调试编译的 die on false 语句。因此,开发人员拥有 assert 语句检查他们的假设的所有好处,而不会导致不必要的错误或影响
中的性能问题
现在我正在工作 php 我正在寻找类似的机制。我目前的 assume 语句看起来像这样:
define(DEBUG, getenv('debug'));
function assume($a)
{
if (DEBUG && !$a)
{
echo 'ASSUME FAILURE <br />';
echo '<pre>';
print_r(debug_backtrace());
die('<pre>');
}
}
assume($a == $b);
如您所见,我在服务器设置中设置了调试标志,以删除实际的 die 语句等。然而,函数调用仍然执行并且 if 语句仍然被评估。如果它只出现几千次,这没什么大不了的,但是随着代码变得越来越大,并且随着这些假设进入循环,这可能会对性能产生合理的影响。
问题
有没有办法告诉解释器或 opcache(我目前正在使用 php 5.5 中包含的 zend opcache)完全忽略这些假设语句?或者有其他方法可以解决这个问题吗?
区别在于C编译器经过优化,可以剔除不用的代码块。在PHP中,assume
是函数调用,函数必须存在
几个解决方案。首先,您可以使用 assert()
。 assert
函数的工作方式类似于您自己的 assume
函数。如果断言失败,则调用定义的断言处理程序。您可以轻松启用或禁用断言,如果禁用它们,则根本不会调用断言处理程序。
如果你想继续你自己的assume
函数,你仍然可以稍微优化一下,通过根据定义声明函数:
<?php
define(DEBUG, getenv('debug'));
if (DEBUG) {
function assume($a) {
echo 'ASSUME FAILURE <br />';
echo '<pre>';
echo print_r(debug_backtrace());
die('<pre>');
}
} else {
function assume($x) {}
}
这样,您实际上将 assume
声明为一个空函数。 Michael Berkowski 的评论证实了我的担心 PHP 并没有完全消除调用,但至少你保存了 if
.
另一个解决方案是调用稍微复杂一点的假设:
DEBUG && assume($x < 10);
这样,如果 DEBUG 为假,则根本不会进行调用。这样只计算布尔值,不调用函数。当然,以这种方式调用它有点困难且可读性较差,但我认为不调用函数的节省比消除 if
.