2011-01-07 18 views
1

從我所瞭解的情況來看,當代碼足夠深時,對象通常比數組更快,因爲它實際上很重要。該效率有何影響,如果我要強制轉換的飛行定義stdClass對象:PHP數組轉換爲對象的效率?

$var = (object)array('one' => 1, 'two' => 2); 

如果要執行很多很多次這樣做是怎麼回事的代碼,我會變得更好顯式定義$var作爲對象而不是:

$var = new stdClass(); 
$var->one = 1; 
$var->two = 2; 

的區別是可以忽略不計,因爲我會接着出現在訪問$var爲對象從,無論哪種方式?

編輯:

一個stdClass的是我需要這裏的數據類型。我不關心是否應該使用數組,還是應該使用stdClass對象;我更關心的是,使用(object)array(....)速記實例化stdClass是否有效。是的,這是代碼將被執行數千次。

+1

stdClass不是數組的替代品。嘗試使用ArrayObject。 「更快」是相對的,在大多數情況下實際上是不相關的。 – Mchl 2011-01-07 17:40:58

回答

3
function benchmark($func_name, $iterations) { 
    $begin = microtime(true); 
    for ($i = 0; $i < $iterations; $i++) { 
     $func_name(); 
    } 
    $end = microtime(true); 

    $execution_time = $end - $begin; 

    echo $func_name , ': ' , $execution_time; 
} 

function standClass() { 
    $obj = new stdClass(); 
    $obj->param_one = 1; 
    $obj->param_two = 2; 
} 

function castFromArray() { 
    $obj = (object)array('param_one' => 1, 'param_two' => 2); 
} 


benchmark('standClass', 1000); 
benchmark('castFromArray', 1000); 

benchmark('standClass', 100000); 
benchmark('castFromArray', 100000); 

輸出:

standClass: 0.0045979022979736 
castFromArray: 0.0053138732910156 

standClass: 0.27266097068787 
castFromArray: 0.20209217071533 

從陣列stdClass的對飛鑄造大約30%的效率,但不同的是仍然可以忽略不計,直到你知道你將要執行的操作10萬次(即使如此,你只能看到十分之一秒,至少在我的機器上)。因此,簡言之,絕大多數時間並不重要,但如果是這樣的話,請在單個命令中定義數組,然後將其轉換爲對象。我絕對不會花時間擔心它,除非你已經確定有問題的代碼是一個瓶頸(如果可能的話,專注於減少迭代次數)。

7

你明白錯了。對象並不比數組「快得多」。實際上,情況正好相反,因爲數組沒有繼承問題(和可見性查找)。當然,也有可能是特定情況下,你可以表現出明顯的顯著收益/虧損,但在一般情況下,陣列將傾向於更快......

使用這就是語義正確的工具。不要避免使用數組,因爲您認爲對象更快。有意義時使用構造。有時候用對象替換數組是有意義的(例如,當你想嚴格強制數組中的類型時)。但這不是其中之一。而即使在這一點,你就不會更換一個StdClass陣列(),你有一個自定義類(一個可能的擴展ArrayObject或者至少實現IteratorArrayAccess接口)替換它。存在不同的Data Structures是有原因的。如果最好使用對象而不是數組,那麼我們是不是都會使用對象呢?

不要擔心微觀優化,例如「鑄更快」。這是almost always not。寫可讀,正確的代碼。然後優化,如果你有一個問題...

0

重要的是要選擇合適的數據結構中合適的工作更重要。

當你要決定用什麼,問自己:什麼是您的數據代表什麼?

你是代表一個集合還是一個序列?那麼你應該使用一個數組。

你代表的一些事情與某些特性或行爲?那麼你應該使用一個對象。