close
恩~感謝朋友們的關心,這幾天有點小感冒,不過總算把藍星侵略者143完食。
現在讓我們來看一下源碼解說,以下三個函數是時點這項功能相關的函數:
function 時點($註記){
$this->時點[$註記] = microtime(true);
}
function 時差($開始, $結束){
$時點 = microtime(true);
$開始 = &$this->時點[$開始];
$結束 = &$this->時點[$結束];
變數:預設($開始, $時點);
變數:預設($結束, $時點);
return abs($開始 - $結束);
}
function &彙整:時點($表格 = false){
$索引 = 0;
$累計 = 0;
$輸出 = array();
asort($this->時點);
$開始 = reset($this->時點);
foreach ($this->時點 as $註記 => $時點) {
$時差 = abs($時點 - $開始);
$累計 += $時差;
$輸出[$索引] = compact(array_keys($this->編碼['時點']));
$開始 = $時點;
$索引++;
}
if ($表格) {
$輸出 = 網頁:表格($輸出, $this->編碼['時點'], '時點', $this->屬性);
}
return $輸出;
}
function 網頁:表格(&$陣列, &$編碼, $標題 = '', &$屬性 = array()){
$輸出 = array();
$排序 = array_keys($編碼);
$輸出[] = '<table' . 網頁:屬性($屬性, true) .'>';
if (false == empty($標題)) {
$輸出[] = '<caption>' . htmlspecialchars($標題) . '</caption>';
}
$輸出[] = '<tr><th>' . implode('</th><th>', $排序) . '</th></tr>';
foreach ($陣列 as &$內容){
$內容 = 陣列:排序($內容, $排序, true);
if (0 == count($內容)) {
continue;
}
$內容 = 陣列:編碼($內容, $編碼);
foreach ($內容 as $鍵 => &$值) {
if ('' == $值) {
$內容[$鍵] = ' ';
}
}
$輸出[] = '<tr><td>' . implode('</td><td>', $內容) . '</td></tr>';
}
$輸出[] = '</table>';
return implode("\n", $輸出);
}
對於量測這個類別來說,在可能的範圍下,盡量求取精確是很重要的一點,所以Benchmark才會去支援BCMath的一些運算方法,希望能提高浮點數的精確度。
實際上,若用BCMath配合microtime,可以得到的精確度是小數點後四位。不過相對於精確度來說,數個樣本的比較希望得到「顯著」的差異,這才是對量測來說更重要的事情。
因為得不到實質上的好處,所以我放棄支援BCMath,專心來處理其他的問題。
在處理跟時間相關的問題時,我發現有時明明比較後面才取得microtime的,可是其數值卻比較小,因此我在所有求取時差的部份全部加上abs來計算絕對值。
彙整:時點 的部份我在處理時先作過排序是因為怕不小心重複使用了相同註記,所以先依照取得的microtime做好排序,然後再產生報表。
輸出的部份我設計了一個通用的輸出HTML的表格的函數,這個函數可以接受一個二維陣列作為資料來源,另外一個一維陣列指示如何處理資料,你可以從 $編碼 這個成員變數看出如何彈性設置,讓這個函數發揮效用。不過呢,這個函數中的迴圈跑了太多次,我會想想該如何改進。
現在讓我們來看一下源碼解說,以下三個函數是時點這項功能相關的函數:
function 時點($註記){
$this->時點[$註記] = microtime(true);
}
function 時差($開始, $結束){
$時點 = microtime(true);
$開始 = &$this->時點[$開始];
$結束 = &$this->時點[$結束];
變數:預設($開始, $時點);
變數:預設($結束, $時點);
return abs($開始 - $結束);
}
function &彙整:時點($表格 = false){
$索引 = 0;
$累計 = 0;
$輸出 = array();
asort($this->時點);
$開始 = reset($this->時點);
foreach ($this->時點 as $註記 => $時點) {
$時差 = abs($時點 - $開始);
$累計 += $時差;
$輸出[$索引] = compact(array_keys($this->編碼['時點']));
$開始 = $時點;
$索引++;
}
if ($表格) {
$輸出 = 網頁:表格($輸出, $this->編碼['時點'], '時點', $this->屬性);
}
return $輸出;
}
function 網頁:表格(&$陣列, &$編碼, $標題 = '', &$屬性 = array()){
$輸出 = array();
$排序 = array_keys($編碼);
$輸出[] = '<table' . 網頁:屬性($屬性, true) .'>';
if (false == empty($標題)) {
$輸出[] = '<caption>' . htmlspecialchars($標題) . '</caption>';
}
$輸出[] = '<tr><th>' . implode('</th><th>', $排序) . '</th></tr>';
foreach ($陣列 as &$內容){
$內容 = 陣列:排序($內容, $排序, true);
if (0 == count($內容)) {
continue;
}
$內容 = 陣列:編碼($內容, $編碼);
foreach ($內容 as $鍵 => &$值) {
if ('' == $值) {
$內容[$鍵] = ' ';
}
}
$輸出[] = '<tr><td>' . implode('</td><td>', $內容) . '</td></tr>';
}
$輸出[] = '</table>';
return implode("\n", $輸出);
}
對於量測這個類別來說,在可能的範圍下,盡量求取精確是很重要的一點,所以Benchmark才會去支援BCMath的一些運算方法,希望能提高浮點數的精確度。
實際上,若用BCMath配合microtime,可以得到的精確度是小數點後四位。不過相對於精確度來說,數個樣本的比較希望得到「顯著」的差異,這才是對量測來說更重要的事情。
因為得不到實質上的好處,所以我放棄支援BCMath,專心來處理其他的問題。
在處理跟時間相關的問題時,我發現有時明明比較後面才取得microtime的,可是其數值卻比較小,因此我在所有求取時差的部份全部加上abs來計算絕對值。
彙整:時點 的部份我在處理時先作過排序是因為怕不小心重複使用了相同註記,所以先依照取得的microtime做好排序,然後再產生報表。
輸出的部份我設計了一個通用的輸出HTML的表格的函數,這個函數可以接受一個二維陣列作為資料來源,另外一個一維陣列指示如何處理資料,你可以從 $編碼 這個成員變數看出如何彈性設置,讓這個函數發揮效用。不過呢,這個函數中的迴圈跑了太多次,我會想想該如何改進。
全站熱搜
留言列表