首页 > 解决方案 > 用微时间测量持续时间随机结果为零

问题描述

我有一个这样的循环:

<?php
ini_set('memory_limit', '16024M');
ini_set('set_time_limit', 9999);
ini_set('max_execution_time', 9999);
ini_set('display_errors',  TRUE);
ini_set('error_reporting',  E_ALL);

for ($k = 1; $k <= 50; $k++) {

    $haystack = array();

    for ($i = 1; $i <= 100; $i++) {

        $randomChar = substr(md5(microtime()),rand(0,26), 1);

        $haystack[] = $randomChar;

    }

    $haystack[] = 'X';

    $startTime = microtime(true);

    // sleep(0);

    $result = in_array('X', $haystack);

    $endTime = microtime(true);

    echo number_format(1000000 * ($endTime - $startTime), 20, ",", " ") . ' ';

 }

这些是输出的前几行:

1,90734863281250000000 0,95367431640625000000 1,19209289550781250000 1,90734863281250000000 1,19209289550781250000 0,95367431640625000000 0,95367431640625000000 1,90734863281250000000 0,95367431640625000000 20,02716064453125000000 0,95367431640625000000 1,19209289550781250000 0,95367431640625000000 0,95367431640625000000 0,00000000000000000000 0,95367431640625000000 0, 95367431640625000000 0,95367431640625000000 0,00000000000000000000 0,95367431640625000000 0,00000000000000000000

如您所见,有几行说明持续时间为“0”——这实际上是不可能的。如果我取消注释包含sleep(0)命令的行,则没有零持续时间。

系统设置

我在 CLI 上运行循环并通过浏览器调用它。

标签: phpdurationmicrotime

解决方案


数组中的 101 个项目对于智能 php 来说足够小了,它具有静态优化技巧和强大的 cpu。

如果您想看到 0-s 消失了,那么生成 1000 个项目:

for ($i = 1; $i <= 1000; $i++) {
    $haystack[] = substr(md5(microtime()),rand(0,26), 1);
}

PS 我已经使用 7.1 和 5.6 检查了您的代码,因此存在很大差异:

php7.1 与 php5.6


推荐阅读