- GitHub上的项目:YaLinqoPerf-性能比较
- GitHub上的项目:YaLinqo-LINQ库
- GitHub上的项目:Ginq-LINQ库
- GitHub上的项目:Pinq-LINQ库
- YaLinqoPerf下载源代码-3 MB
介绍
本文是关于比较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的解决方案慢两倍。其他库的性能较差,但还算满意。
相关文章