【问题标题】:PHP ::: Speed Test ::: $_SESSION vs. $variablePHP ::: 速度测试 ::: $_SESSION vs. $variable
【发布时间】:2012-01-27 03:52:09
【问题描述】:

我有一个输入量相当大的表单,而且流量也很大。 我声明了 $_SESSION 变量,以便在验证失败时,通过的数据不必为了用户方便而重写。

像这样验证我的表单输入后:

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

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

我现在在更新数据库等的相同方法中有两个具有相同值的变量。

我的问题是,从那时起,在使用 a 的方法中是否更快:

$hey; //regular variable

或者一个:

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

性能有区别吗?在高容量时,一个比另一个执行得更快吗?

【问题讨论】:

  • 在进行散列查找与普通变量查找之前,您可能需要做很多其他不太复杂的优化。
  • $_SESSION 变量可能会占用更多内存,因为它似乎是一个“超全局”变量。即便如此,$_SESSION 变量使用起来还是很方便的。我想这最终取决于您的脚本/程序的需求。参考:php.net/manual/en/reserved.variables.session.php
  • 我不会为这种优化而烦恼。这是一分钱的明智和一英镑的愚蠢

标签: php session


【解决方案1】:

我将在此处支持 cmets,如果您要优化,则不会通过消除重复变量获得太大改进(尽管如果您有巨大的变量,您希望消除重复以保留内存 - 不是速度)。但是,为了演示,我设置了这个基准来测试:

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 />";

多次运行的结果:

$hey 耗时 0.079180002212524 微秒 $_SESSION['hey'] 耗时 0.096824884414673 微秒 $hey_array['hey'] 耗时 0.091028928756714 微秒

$hey 耗时 0.080883026123047 微秒 $_SESSION['hey'] 耗时 0.095050096511841 微秒 $hey_array['hey'] 耗时 0.091977834701538 微秒

$hey 耗时 0.081928968429565 微秒 $_SESSION['hey'] 耗时 0.097215890884399 微秒 $hey_array['hey'] 耗时 0.092087030410767 微秒

$hey 耗时 0.081655979156494 微秒 $_SESSION['hey'] 耗时 0.098057985305786 微秒 $hey_array['hey'] 耗时 0.09247899055481 微秒

$hey 耗时 0.081120014190674 微秒 $_SESSION['hey'] 耗时 0.096808910369873 微秒 $hey_array['hey'] 耗时 0.092255115509033 微秒

$hey 耗时 0.081827878952026 微秒 $_SESSION['hey'] 耗时 0.096134901046753 微秒 $hey_array['hey'] 耗时 0.092247009277344 微秒

$hey 耗时 0.081613063812256 微秒 $_SESSION['hey'] 耗时 0.096814870834351 微秒 $hey_array['hey'] 耗时 0.090691804885864 微秒

所以,在 100,000 次循环中,我们谈论的是 0.01 MICROSCONDS。

然而,值得注意的是,速度差异几乎完全归因于需要访问关联数组。它是一个超全局的事实并不会影响它(但是,数组的长度会影响它,如果您的 SESSION 数组变得很大,您将开始看到微小的速度差异(但同样,我们说的是百万分之一秒)。

【讨论】:

    【解决方案2】:

    我没有对此进行任何基准测试,但我强烈怀疑 $_SESSION[] 将总是比写入的普通变量慢一点,因为它由文件系统或数据库提供支持。即使所有 $_SESSION[] 存储都被缓存,使用它仍然会比使用仅在本地保存的变量涉及更多的 CPU 和内存活动。对于读取,仍然可能存在微小差异,但与其他因素相比可以忽略不计。

    所以上面的评论对钱是正确的。您还有其他比这更重要的优化领域。

    如果您希望提高性能,请考虑在 JavaScript 中复制一些输入验证。 (不要替换服务器端验证,因为 JS 不是通用的;如果可能,请考虑避免需要它的方法。)

    【讨论】:

    • @Graham 不确定您对文件系统因素的看法是否正确。文件写入仅在脚本执行结束时序列化变量时发生一次。虽然使用会话确实会增加脚本执行的开销,但不会影响变量访问性能。
    • 我不知道 $_SESSION 仅在脚本完成时被序列化和写入。为了争论起见,我认为 OP 的问题“从那时起是否更快”可以在脚本的上下文中具体考虑或与服务器整体考虑。如果通常您对 $_SESSION 变量进行了不必要的更改,那么您生成的文件系统写入量超出了您的需要,这会减慢整个服务器的速度。但是,当然,这是虚假的;我同意影响可以忽略不计。
    【解决方案3】:

    性能存在细微差别。当我说边缘时,我的意思是非常非常小。它是$_SESSION 阵列这一事实没有任何轴承性能。与访问变量相比,查找关联数组所需的时间稍长。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-21
      • 1970-01-01
      • 2014-08-16
      • 1970-01-01
      • 1970-01-01
      • 2015-03-15
      • 2011-10-14
      • 2012-05-29
      相关资源
      最近更新 更多