Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/295.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.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 如果我声明(勾号=1),但不';如果不注册tick函数,那么生成的tick处理会产生什么样的开销?_Php_C_Performance_Microbenchmark - Fatal编程技术网

Php 如果我声明(勾号=1),但不';如果不注册tick函数,那么生成的tick处理会产生什么样的开销?

Php 如果我声明(勾号=1),但不';如果不注册tick函数,那么生成的tick处理会产生什么样的开销?,php,c,performance,microbenchmark,Php,C,Performance,Microbenchmark,首先,关于勾号功能的基本原理似乎有很多问题,所以我想为任何想了解更多信息的人补充一下。我在四处挖掘的时候发现了它,当时我正试图弄清楚下面的内容 因此,我正在编写一个简单的调试助手。我想添加功能跟踪和基准测试-基本上什么样的勾号功能是完美的 问题是,我想根据脚本处理过程中出现的任意条件启用和禁用基准测试。我并不是真的在寻找一个范围为declare(){…}的固定调试 我想做的是把declare()放进去位于脚本顶部,然后根据需要注册和注销调试/基准测试(勾选)功能。取消/注册不会(太)频繁,因此

首先,关于勾号功能的基本原理似乎有很多问题,所以我想为任何想了解更多信息的人补充一下。我在四处挖掘的时候发现了它,当时我正试图弄清楚下面的内容


因此,我正在编写一个简单的调试助手。我想添加功能跟踪和基准测试-基本上什么样的勾号功能是完美的

问题是,我想根据脚本处理过程中出现的任意条件启用和禁用基准测试。我并不是真的在寻找一个范围为
declare(){…}
的固定调试

我想做的是把
declare()放进去位于脚本顶部,然后根据需要注册和注销调试/基准测试(勾选)功能。取消/注册不会(太)频繁,因此是高效和合理的

但后来我很好奇:当我没有注册勾号函数时。。。我运行
的事实是否声明(ticks=1)对执行效率有影响吗?它是否会导致任何额外处理永久启用

对PHP(7)源代码的分析表明,从技术上来说,答案是肯定的,但我还不确定如何回答

答案似乎是这样的:似乎此函数将编译处理推迟到适当的例程,然后如果启用了tick,它将通过中的
ZEND\u emit\u tick()
向opline另外发送一个
ZEND\u tick
操作码。这个结论似乎是一致的;它显示了一个反汇编操作码列表示例,其中包含散布在其中的TICKS操作码,我想知道它们是如何出现的,直到我发现了上面的内容

ZEND\u TICKS
处理程序(in)似乎调用了
ZEND\u TICKS\u函数()。这被映射到中的
ticks\u function()
in,而该函数又被映射到中的
php\u run\u ticks()。这最终在中定义,其中包括:

void php_run_ticks(int count)
{
  zend_llist_apply_with_argument(
    &PG(tick_functions),
    (llist_apply_with_arg_func_t) php_tick_iterator,
    &count
  );
}
嗯。不错

但事情是这样的。如果我
声明(ticks=1),上面的分派将针对执行的每个语句运行。那是。。。哎哟对于包含高迭代次数、紧密处理循环的长时间运行脚本,我想知道这会有多糟糕

问题是,我甚至不知道如何对其进行基准测试。我能设想的唯一方法是合成一些PHP字节码,然后找出一种方法将其直接注入PHP字节码解释器

这就引出了我的问题:实际上,这种额外的调度对性能有多大影响?我如何量化它


显然,上述调查是在规范的PHP.net解释器上进行的。我还没有研究过HHVM是如何做到这一点的,但我一点也不介意学习它是如何处理的。

听起来你应该给它设定基准,但是你必须编写一个基准来给你的基准设定者设定基准。@ArtisticPhoenix:没错。这就是我思考字节码操作的原因。它将消除这种无限递归问题。您在
ticks=1时失去了我,对不起。这很有趣,我希望我知道。。。当我做基准点的时候,我只是在微时间里计时,这就是我的
简单基准测试的想法
@ArtisticPhoenix:非常好。我把这个问题留在这里,我知道它需要一段时间才能得到回答(甚至可能在几周或几个月后才会有一个邮件列表),因为它的级别非常低。我主要只是对学术感兴趣。TL;DR,
declare(ticks=1)
允许您使用
register\u tick\u function()
注册将在每个PHP语句之间运行的函数。它曾经是理智的信号处理所需要的,一些疯狂的人用它在PHP4中实现假异常。它基本上是一个低级的大锤,谢天谢地,现在几乎没有什么用处。(谢天谢地,我的意思是说,我很庆幸,它非常笨拙地实现了一些事情,现在可以使用规范的、一流的语言特性(实际上可以维护使用!),听起来你应该给它做个基准,但是,你必须写一个基准测试工具来测试你的基准测试工具。@ArtisticPhoenix:没错。这就是我思考字节码操作的原因。它将消除这种无限递归问题。您在
ticks=1时失去了我,对不起。这很有趣,我希望我知道。。。当我做基准点的时候,我只是在微时间里计时,这就是我的
简单基准测试的想法
@ArtisticPhoenix:非常好。我把这个问题留在这里,我知道它需要一段时间才能得到回答(甚至可能在几周或几个月后才会有一个邮件列表),因为它的级别非常低。我主要只是对学术感兴趣。TL;DR,
declare(ticks=1)
允许您使用
register\u tick\u function()
注册将在每个PHP语句之间运行的函数。它曾经是理智的信号处理所需要的,一些疯狂的人用它在PHP4中实现假异常。它基本上是一个低级的大锤,谢天谢地,现在几乎没有什么用处了。(谢天谢地,我的意思是说,我很感谢它非常笨拙地实现了一些事情,现在可以使用规范的、一流的语言特性(实际上可以维护使用!)