2012-01-27 138 views
2

我有一個相當大的輸入量也將是高流量的形式。 我聲明瞭$ _SESSION變量,因此在驗證失敗的情況下,通過的數據不必爲了便於用戶而重寫。

經過驗證我的表單輸入這樣的:

$hey = htmlspecialchars($_POST['hey']); 

if(correct_value($hey) == TRUE) { 
    $_SESSION['hey'] = $hey; 
} 

我現在有相同的方法相同的值,我更新數據庫等

我的問題兩個變量,是更快從此方法中使用的工作:

$hey; //regular variable 

還是一個:

$_SESSION['hey']; //session variable 

性能有差別嗎?在大量的情況下,其中一個執行速度快於另一個?

+6

在進行哈希查找與普通變量查找之前,您可能需要做很多其他的複雜優化工作 – 2012-01-27 03:54:34

+2

$ _SESSION變量可能會佔用更多內存,因爲它看起來像是一個「超全局」變量即使如此,$ _SESSION變量可以很方便地使用,我想最終取決於你的腳本/程序的需求。參考:http://www.php.net/manual/en/reserved.variables.session.php – summea 2012-01-27 03:59:34

+0

我不會用這種優化來打擾自己。這是一分錢智慧和英鎊愚蠢 – Nemoden 2012-01-27 04:14:10

回答

2

我還沒有做過這方面的任何基準測試,但是我強烈懷疑$ _SESSION [] 總是比寫入的正常變量慢一點,因爲它受文件系統或數據庫支持。即使所有$ _SESSION []存儲都被緩存,使用它的CPU和內存活動仍然會比使用僅保存在本地的變量更多。對於閱讀,仍然可能會有一個小的差異,但與其他因素相比,它可以忽略不計。

所以上面的評論是正確的錢。你還有其他比這個更重要的優化領域。

如果您希望提高性能,請考慮在JavaScript中複製一些輸入驗證。 (請不要REPLACE服務器端驗證,因爲JS不是通用的;只是考慮避免需要它的方法)

+1

關於文件系統支持寫入的好處 – ghoti 2012-01-27 04:10:39

+1

@Graham不知道你是對的文件系統因素。只有在腳本執行結束時將變量序列化後,纔會寫入文件。雖然使用會話不會增加腳本執行的開銷,但不會影響變量訪問性能。 – dellsala 2012-01-27 04:22:00

+0

我不知道$ _SESSION僅在腳本結束時被序列化和寫入。爲了辯論的緣故,我認爲OP的問題「從那以後是否更快」可以專門在腳本的上下文中或與服務器整體上考慮。如果一般情況下您正在不必要地更改$ _SESSION變量,則會生成比您需要的更多的文件系統寫入操作,這會降低整個服務器的速度。但當然,這是虛假的;我同意這種影響可以忽略不計。 – Graham 2012-01-27 04:27:03

1

性能差異很小。當我說邊際,我的意思是真的,真的很小。事實上,這是$_SESSION陣列沒有任何軸承性能。這是關聯數組查找所花費的時間比訪問變量稍長。

4

如果您打算優化您的操作,通過消除重複的變量不會有太大的改進(儘管如果你有很大的變量需要消除重複來保存內存,而不是速度)。然而,對於示範的緣故,我這個基準設置進行測試:

session_start(); 
$hey = "THIS IS A TEST OF ACCESS SPEEDS"; //our variable 
$_SESSION['hey'] = $hey; //out session variable 
$hey_array = array('a'=>'random','b'=>'random','c'=>'random'); //another random array 
$hey_array['hey'] = $hey; 

function access_the_variable($var){ 
    $waste_some_time = substr($var,0,10); //this could be anything 
} 

//GO! 
$start = microtime(true); 
for($i=0;$i<100000;$i++){ 
    access_the_variable($hey); 
} 
$end = microtime(true); 
echo "\$hey took ".($end-$start)." microseconds<br />"; 

$start = microtime(true); 
for($i=0;$i<100000;$i++){ 
    access_the_variable($_SESSION['hey']); 
} 
$end = microtime(true); 
echo "\$_SESSION['hey'] took ".($end-$start)." microseconds<br />"; 

$start = microtime(true); 
for($i=0;$i<100000;$i++){ 
    access_the_variable($hey_array['hey']); 
} 
$end = microtime(true); 
echo "\$hey_array['hey'] took ".($end-$start)." microseconds<br /><br />"; 

幾個試驗的結果:

$哎拿了0.079180002212524微秒$ _SESSION [ '嗨']把 0.096824884414673微秒$ hey_array [ '嗨']把0.091028928756714微秒

$嘿了0.080883026123047微秒$ _SESSION [ '嗨']把 0.095050096511841微秒$ hey_array [ '嗨']把0.091977834701538微秒

$ hey花了0.081928968429565微秒$ _SESSION ['hey']花了 0.097215890884399微秒$ hey_array ['hey']花了0。092087030410767微秒

$嘿了0.081655979156494微秒$ _SESSION [ '嗨']把 0.098057985305786微秒$ hey_array [ '嗨']把0.09247899055481微秒

$嘿了0.081120014190674微秒$ _SESSION [ '嗨']把 0.096808910369873微秒$ hey_array [ '嗨']把0.092255115509033微秒

$嘿了0.081827878952026微秒$ _SESSION [ '嗨']把 0.096134901046753微秒$ hey_array [ '嗨']把0.092247009277344微秒

$嘿了0.081613063812256微秒$ _SESSION [ '嗨']把 0.096814870834351微秒$ hey_array [ '嗨']把0.090691804885864微秒

所以,10萬個循環,我們談論約0.01微秒。

但值得注意的是,速度差異幾乎完全歸因於需要訪問關聯數組。然而,它是一個超全球化的事實並不影響它(數組長度的確如此),如果你的SESSION數組變大,你將開始看到微小的速度差異(但同樣,我們正在說百萬分之幾秒的百分之幾)。