【问题标题】:Which is best? PHP lambda vs class object method哪个最好? PHP lambda vs 类对象方法
【发布时间】:2016-01-15 10:01:32
【问题描述】:

想知道以下方法的性能有何不同。

// in dependencies.php
$greeting=function(){echo "lambda";};

// in MyClass.php
class MyClass{
 function greeting(){echo "class";}
}

// in index.php
include dependencies.php
include MyClass.php

....
// assume using Slim or Laravel routing. 
$app->get('/test1', $greeting);
$app->get('/test2', 'MyClass:greeting');
$app->get('/test3', function(){ echo "anonymous"; });

哪种方法性能最佳?为什么?

【问题讨论】:

  • 如果您对性能感兴趣:对其进行基准测试。 很可能它完全没有实际区别。

标签: php lambda anonymous


【解决方案1】:

您可以使用它来查看运行每个脚本需要多少时间

$start =  microtime(true);
$app->get('/test1', $greeting); // replace this one with each of the others
$end = microtime(true);
echo $end-$start; // microseconds

至于内存:

echo memory_get_usage() . "\n"; 
$app->get('/test1', $greeting); // replace this one with each of the others
echo memory_get_usage() . "\n"; 

但我相信您可以找到合适的基准测试库。

在我个人看来,类方法可能会变得最慢。这可能是由于大型 __constructor__destructor 实现所致。

【讨论】:

  • ...在这么短的代码中没有任何意义来解决更快或占用更少内存的问题。
  • 是的,但是假设函数变得更复杂一点,它可能会变得有用
  • 我只愿意为更长的代码做这个,而不是这么短的代码。但你是对的。
【解决方案2】:

我试过了

// in dependencies.php
$greeting=function(){echo "lambda";};
$greeting2=function(){echo "lambda2";};

// in MyClass.php
class MyClass{
 function greeting(){echo "class";}
}

// in MyClass2.php
class MyClass2{
 function greeting(){echo "class2";}
}

// in index.php
include dependencies.php
include MyClass.php
include MyClass2.php

....
// I test this with Slim3 framework
$app->get('/test1', $greeting);
$app->get('/test2', $greeting2);
$app->get('/test3', 'MyClass:greeting');
$app->get('/test4', 'MyClass2:greeting');
$app->get('/test5', function(){ echo "anonymous"; });
结果: 测试1 0.0031208992004395 测试2 1.8119812011719E-5 测试3 1.0967254638672E-5 测试4 1.0013580322266E-5 测试5 1.0967254638672E-5 然后我尝试了不同的序列,结果如下: 测试1 0.0039870738983154 测试3 1.9073486328125E-5 测试2 1.5020370483398E-5 测试4 1.0967254638672E-5 测试5 1.215934753418E-5 测试1 0.004763126373291 测试5 2.1934509277344E-5 测试3 1.1920928955078E-5 测试2 1.0967254638672E-5 测试4 1.0013580322266E-5 测试5 0.0038559436798096 测试1 2.0027160644531E-5 测试3 1.2874603271484E-5 测试2 1.1920928955078E-5 测试4 1.0967254638672E-5

在这个简单的实现中,看起来它是 lambda、对象还是匿名都无关紧要。

【讨论】:

  • 在这个简短的情况下它是。使用更长的代码可以获得更好的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-14
  • 1970-01-01
相关资源
最近更新 更多