2010-11-14 38 views
1

我將有大約5 MB大小的文件,我有2種選擇:序列化的字符串或普通的PHP,這是更快的解析?

  1. 閱讀使用包括功能的文件純PHP陣列
  2. 閱讀序列化/ json轉換陣列從文件使用file_get_contents函數然後解碼它。

哪一個會更快?我將使用它作爲緩存。

+2

我認爲前者更快。但是直到你測試並分析兩個變體之後,你纔會知道。 – Gumbo 2010-11-14 21:36:11

+0

如果數組是平的,考慮也parse_ini_file – 2010-11-14 21:38:09

+2

你確定你沒有預先優化嗎?我不認爲這兩種方法都應該是性能瓶頸。我只是選擇你更適合的方法,或者最適合這個項目。優化在這裏聽起來不重要。 – 2010-11-14 21:38:50

回答

2

即使您使用字節碼緩存,讀取序列化數組的速度也會更快。

+0

你是基於什麼聲明? – troelskn 2010-11-14 21:41:26

+0

@troelskn,這兩種方法都涉及將文件加載到內存中,但選項1涉及完整的php解釋器,而選項2只涉及json解析器。 php解釋器比json解析器複雜得多,所以我會懷疑AndreKR是正確的。 – 2010-11-14 21:43:23

+0

@troelskn在我們公司,我們多次遇到這個問題,並檢查了很多不同的環境,結果發現反序列化方法總是快幾倍。 – AndreKR 2010-11-14 21:46:00

4

最初,當我看着這個問題時,我猜想PHP +操作碼緩存會比序列化的PHP更快,但是經過幾次基準測試後,我發現我錯了。 unserialize執行的性能比require好4倍。雖然通過var_export編寫PHP似乎比serialize更快。 PHP格式也具有人類可讀性的優點。

alt text

注:我跑的測試用PHP 5.3.3,並使用一個RAM磁盤作爲我的臨時文件夾。

如果你有內存空間(和APC安裝),我會建議使用apc_store。我沒有對它進行基準測試,但我希望它比基於文件的緩存更快。

<? 

function writestuff($folder, $data) { 
    $start = microtime(TRUE); 
    file_put_contents("$folder/array.data", serialize($data)); 
    print (microtime(TRUE) - $start).","; 


    $start = microtime(TRUE); 
    file_put_contents("$folder/array.php", "<? return ".var_export($data, TRUE).";"); 
    print (microtime(TRUE) - $start).","; 
} 

function readstuff($folder) { 
    $start = microtime(TRUE); 
    $data = unserialize(file_get_contents("$folder/array.data")); 
    print (microtime(TRUE) - $start).","; 
    unset($data); 

    apc_clear_cache(); 
    if(! apc_compile_file("$folder/array.php")) 
     throw new Exception("didn't cache"); 

    $start = microtime(TRUE); 
    $data = require("$folder/array.php"); 
    print (microtime(TRUE) - $start)."\n"; 
    unset($data); 
} 

$folder = $_GET["folder"]; 

for($i = 1; $i < 10000; $i += 10) { 
    $data = range(0, $i); 
    print $i.","; 
    writestuff($folder, $data); 
    readstuff($folder); 

} 

?> 
+0

你是如何生成圖形的? :o – Wiliam 2010-11-23 22:04:15

+0

Excel 2011 Mac,散點圖。 – 2010-11-24 00:35:11