今天要談的是有關測試這個功能項目的解說,廢話不多說,來看源碼:


    private function &耗時(&$開始, &$結束){
        $耗時 = array();
        $次數 = count($開始);
        for ($索引 = 0; $索引 < $次數; $索引++){
            $耗時[$索引] = abs($結束[$索引] - $開始[$索引]);
        }
        return $耗時;
    }

    function &彙整:測試($表格 = false){
        $輸出 = &$this->測試;
        if(false == $表格) {
            return $輸出;
        }
        $輸出 = 網頁:表格($輸出, $this->編碼['測試'], '測試', $this->屬性);
        return $輸出;
    }

    private function &統計(&$開始, &$結束){
        $耗時 = &$this->耗時($開始, $結束);
        sort($耗時);
        $輸出 = array(
            '最小' => reset($耗時), '最大' => end($耗時),
            '次數' => count($耗時), '累計' => array_sum($耗時)
        );
        $輸出['平均'] = 數學:除法($輸出['累計'], $輸出['次數']);
        return $輸出;
    }
   
    function &多重測試($次數, $函數表){
        $測試 = array();
        foreach ($函數表 as $註記 => &$參數) {
            $函數 = &$參數[0];
            array_unshift($參數, $次數, $註記);
            $測試[$註記] = &call_user_func_array(array($this, '單一測試'), $參數);
        }
        return $測試;
    }
   
    function &多重測試:陣列($次數, $函數表){
        $測試 = array();
        foreach ($函數表 as $註記 => &$參數) {
            $測試[$註記] = &$this->單一測試:陣列($次數, $註記, $參數[0], $參數[1]);
        }
        return $測試;
    }

    function &單一測試(){
        $參數 = &func_get_args();
        $次數 = &array_shift($參數);
        $註記 = &array_shift($參數);
        $函數 = &array_shift($參數);

        $_參數 = array();
        for ($索引 = 0; $索引 < $次數; $索引++){
            $_參數[$索引] = &$參數;
        }
        return $this->單一測試:陣列($次數, $註記, $函數, $_參數);
    }

    function &單一測試:陣列($次數, $註記, $函數, &$參數 = array()){
        $開始 = array();
        $結束 = array();
        $耗時 = array();
        if (false == is_callable($函數)) {
            return $耗時;
        }

        for ($索引 = 0; $索引 < $次數; $索引++){
            $開始[$索引] = microtime(true);
            call_user_func_array($函數, $參數[$索引]);
            $結束[$索引] = microtime(true);
        }
       
        $測試 = &$this->測試[$註記];
        $測試 = $this->統計($開始, $結束);
        $測試['註記'] = $註記;
        return $測試;
    }

四種不同測試呼叫,最終都會呼叫 單一測試:陣列 來作實際的量測。
這裡把量測時間放在迴圈內,只是希望得到比較精確的數值,不過話說回來了,之前我測試各種呼叫方式的差異,這裡使用 call_user_func_array 本來就已經不準了,所以下一版我應該會把量測時間點移出迴圈外。

基本上那個統計函數也只是作簡單的敘述統計而已,但是下一版若把量測時間點移出迴圈外,就無法取得最大最小值,所以下一版會把這兩個統計值給拿掉。就實用上而言,若真的需要這兩個值,不如就使用調用功能還比較清楚。

還有一個改進的地方是跟 :陣列 有關的兩個函數,下一版對這兩個函數會取消 $次數 的參數傳遞,改以取得參數陣列中項目的個數作為次數。

這兩天放的程式碼都還算簡單,需要詳加解釋地方不多,基本上對PHP的陣列操作熟悉大概都不是問題。
arrow
arrow
    全站熱搜

    HACGIS 發表在 痞客邦 留言(0) 人氣()