将数据存储在对象中。哪种方法更快?

时间:2012-05-18 08:51:37

标签: php optimization

您好我最近看到this article有关如何将数据存储到对象中的信息:

$profile = new stdClass;
$profile->first_name = 'Woppi';
$profile->last_name = 'Jillenjack';
$profile->email = 'woppi.jillenjack@gmail.com';

我习惯把它变成一个数组,然后将它强制转换为对象(在我阅读文章之前):

$profile = array('first_name'=>'Woppi', 'last_name'=>'Jillenjack', 'email'=>'woppi.jillenjack@gmail.com');
$profile = (object)$profile;

我认为第一种方法更快。我怎么知道哪个更快...你能建议一种我能找到的方法吗?

非常感谢。

2 个答案:

答案 0 :(得分:1)

如果您在Linux上运行PHP,则可以使用microtime()来衡量运行每个方法的时间 * Windows不会返回正确的时间,而是近似值。如果你试图在几微秒内测量某些东西,这对你没有什么帮助。

另外我认为第二种方法应该更快,因为它将使用用C编写的集成函数,而不是解释几行PHP代码然后执行它们。

所以我投票给第二个。您还可以通过衡量每种方法所需的时间来获得乐趣。

答案 1 :(得分:1)

在这两种情况下,您都需要创建一个类的实例(stdClass或Array)并设置数据。在第二种情况下,你添加一个新的操作,因此存在一个隐式的stdClass实例的创建和从Array到stdClass的解析数据操作。

在第一种情况下,您只创建一个类的实例,在第二种情况下创建两者,但1对程序员是不可见的。我认为第一个是内存和速度更高效

  1 <?php                                                                                                                                                                          
  2                                                                                
  3  $time_start = microtime(true);                                                
  4                                                                                
  5 for($i=0 ; $i<1000000; $i++)                                                   
  6 {                                                                              
  7  $profile = new stdClass;$                                                      
  8  $profile->first_name = 'Woppi';                                               
  9  $profile->last_name = 'Jillenjack';                                           
 10  $profile->email = 'woppi.jillenjack@gmail.com';                               
 11  $time_end = microtime(true);$                                                  
 12 }                                                                              
 13                                                                                
 14  $object = $time_end - $time_start;                                            
 15                                                                                
 16                                                                               
 17  $time_start = microtime(true);                                               
 18  for($i=0;$i<1000000;$i++)                                                     
 19  {                                                                             
 20  $profile = array('first_name'=>'Woppi',                                      
 21          'last_name'=>'Jillenjack',                                            
 22          'email'=>'woppi.jillenjack@gmail.com');                               
 23  $profile = (object)$profile;                                                  
 24  $time_end = microtime(true);                                                  
 25  }                                                                             
 26  $array_to_object = $time_end - $time_start;                                   
 27                                                                                
 28  echo "stdClass: $object | Typecasting: $array_to_object";                     
 29                                                                              
 30 ?>

stdClass:10.045720100403 |类型转换:10.009358882904

stdClass:9.9519069194794 |类型转换:9.2100629806519

stdClass:9.2515120506287 |类型转换:9.480808019638

stdClass:9.5376181602478 |类型转换:9.2310011386871

stdClass:9.9628109931946 |类型转换:10.414475917816

测试不是决定性的,在这种情况下,可能消耗的内存可以帮助我们选择使用其中一个或其他