LINQ PHP比较:YaLinqo,Ginq,Pinq

分享于 

4分钟阅读

Web开发

  繁體

介绍

本文是关于比较LINQ端口的(主要是性能方面的)。在.NET中,LINQ用于在各种集合(包括数据库)上编写类似SQL的查询。在PHP中,它通常用于转换数组,例如函数array_filter和array_map,但是以更易读的形式并且具有更多功能。

这三个库均具有许可的开源许可证,良好的测试覆盖范围,文档,支持许多功能,可在Packagist上使用,并且可以任何项目中使用。

请注意,这三个库的大小非常不同:YaLinqo包含4个类,并且没有依赖关系; Ginq包含70多个类,并且依赖于Symfony的属性访问模块; Pinq包含500多个类,并且依赖于PHP解析器,不同之处在于它们的架构。YaLinqo只使用PHP数组和回调,Pinq包括用于每次转换,集合,比较器等的迭代器类。 Ginq包含受LINQ in启发的更多类和接口。)

关于测试

测试是在PHP 5.5.14,Windows 7 SP1 64位上执行的。

测验

从纯开销开始:

benchmark_linq_groups("Iterating over $ITER_MAX ints", 100, null,
 [
 "for" => function () use ($ITER_MAX) {
 $j = null;
 for ($i = 0; $i <$ITER_MAX; $i++)
 $j = $i;
 return$j;
 },
 "array functions" => function () use ($ITER_MAX) {
 $j = null;
 foreach (range(0, $ITER_MAX - 1) as $i)
 $j = $i;
 return$j;
 },
 ],
 [
 function () use ($ITER_MAX) {
 $j = null;
 foreach (E::range(0, $ITER_MAX) as $i)
 $j = $i;
 return$j;
 },
 ],
 [
 function () use ($ITER_MAX) {
 $j = null;
 foreach (G::range(0, $ITER_MAX - 1) as $i)
 $j = $i;
 return$j;
 },
 ],
 [
 function () use ($ITER_MAX) {
 $j = null;
 foreach (P::from(range(0, $ITER_MAX - 1)) as $i)
 $j = $i;
 return$j;
 },
 ]);

以下是结果:

Iterating over 1000 ints
------------------------
 PHP [for] 0.00006 sec x1.0 (100%)
 PHP [array functions] 0.00011 sec x1.8 (+83%)
 YaLinqo 0.00041 sec x6.8 (+583%)
 Ginq 0.00075 sec x12.5 (+1150%)
 Pinq 0.00169 sec x28.2 (+2717%)

迭代器浪费了很多时间,Pinq的速度比速度慢30倍之多。

生成一个数组,而不是迭代:

benchmark_linq_groups("Generating array of $ITER_MAX integers", 100, 'consume',
 [
 "for" =>
 function () use ($ITER_MAX) {
 $a = [ ];
 for ($i = 0; $i <$ITER_MAX; $i++)
 $a[] = $i;
 return$a;
 },
 "array functions" =>
 function () use ($ITER_MAX) {
 return range(0, $ITER_MAX - 1);
 },
 ],
 [
 function () use ($ITER_MAX) {
 return E::range(0, $ITER_MAX)->toArray();
 },
 ],
 [
 function () use ($ITER_MAX) {
 return G::range(0, $ITER_MAX - 1)->toArray();
 },
 ],
 [
 function () use ($ITER_MAX) {
 return P::from(range(0, $ITER_MAX - 1))->asArray();
 },
 ]);

结果:

Generating array of 1000 integers
---------------------------------
 PHP [for] 0.00025 sec x1.3 (+32%)
 PHP [array functions] 0.00019 sec x1.0 (100%)
 YaLinqo 0.00060 sec x3.2 (+216%)
 Ginq 0.00107 sec x5.6 (+463%)
 Pinq 0.00183 sec x9.6 (+863%)

YaLinqo现在仅比for的解决方案慢两倍。其他库的性能较差,但还算满意。


COM  PHP  LINQ  GIN  
相关文章