
LINQãšã¯äœããPHPããããããçç±ãããããªãå Žåã¯ã
以åã®YaLinqoã®èšäºãåç
§ããŠ
ãã ãã ã
æ®ããç¶ããŸãã ç§ã¯ããã«èŠåããŸãïŒã€ãã¬ãŒã¿ãPHPã§äœããã®çç±ã§ãã©ãã°ããäžèŠãªãã®ã§ãããšèããå Žåãå¿å颿°ãå«ããããã®æ°ãããã®ãã¹ãŠãæ®é
·ã«ãµã°ããŠããããããã®ããã©ãŒãã³ã¹ã¯ãã€ã¯ãç§ããšã«æž¬å®ããå¿
èŠããããŸãçºæãããŠããªã-ããããéãéããã ã©ã€ãã©ãªãšèšäºã¯ããªãã®ããã§ã¯ãããŸããã
æ®ããç¶ããŸãã LINQã¯åªããŠããŸããã䜿çšãããšããã©ãŒãã³ã¹ã¯ã©ãã ãäœäžããŸããïŒ ãã¢ãµã€ã¯ã«ãšæ¯èŒãããšãé床ã¯3ã5åæªæºã§ãã ç¡å颿°ãæž¡ãããé
åã®é¢æ°ãšæ¯èŒãããšã2ã4ããšã«ãªããŸãã å°ããªããŒã¿é
åã¯ã©ã€ãã©ãªã®å©ããåããŠåŠçãããè€éãªããŒã¿åŠçã¯ã¹ã¯ãªããã®å€éšïŒããŒã¿ããŒã¹å
ããµãŒãããŒãã£ã®WebãµãŒãã¹å
ïŒã«ãããšæ³å®ãããŠãããããå®éã«ã¯ã¹ã¯ãªããå
šäœã§ããããªæå€±ããããŸãã äž»ãªãã®ã¯èªã¿ãããã§ãã
YaLinqoã©ã€ãã©ãªãäœæããŠããããã«2ã€ã®ç«¶åä»ç€Ÿãæããã«ãªã£ãã®ã§ããããã¯å®éã«LINQã§ããïŒã€ãŸããé
å»¶èšç®ãšãã®ä»ã®åºæ¬æ©èœããµããŒãããŠããŸãïŒãã©ã€ãã©ãªãæ¯èŒããããšãã
å§ãããŸãã æãåçŽã§æãè«ççãªã®ã¯ãæ©èœãšããã©ãŒãã³ã¹ãæ¯èŒããããšã§ãã
åã®æ¯èŒã®ããã«ãå°ãªããšãããã¯å¹Œå
ã®æŽè¡ã«ã¯ãªããŸããã
ïŒãŸããç«¶åä»ç€Ÿã®åºçŸã«ãããæçµçã«
YaLinqoã®ããã¥ã¡ã³ãããªã³ã©ã€ã³ã§æçš¿ããããã«
ãªããŸãã ãïŒ
å
責äºé
ïŒãããã¯ããŒãã€ãã¹ãã§ãã 圌ãã¯ãã¹ãŠã®ããã©ãŒãã³ã¹ã®æå€±ã®æšå®å€ãäžããŠããŸããã ç¹ã«ãã¡ã¢ãªæ¶è²»ãå®å
šã«èæ
®ããŠããŸããã æ®éã«ãããããæ¹æ³ãããããªãããã§ãã ãã®å Žåã
ãã«ãªã¯ãšã¹ãã¯æè¿ãããŸãã
ç«¶åä»ç€ŸYaLinqo -
PHPã®ãªããžã§ã¯ããžã®ãã1ã€ã®LINQ ã ãªããžã§ã¯ãïŒé
åãšã€ãã¬ãŒã¿ïŒã§ã®ã¿ã¯ãšãªããµããŒãããŸãã PHP 5.3以éïŒyieldãªãïŒãšPHP 5.5以éïŒyieldããïŒã®2ã€ã®ããŒãžã§ã³ããããŸãã ææ°ããŒãžã§ã³ã¯ããã¹ãŠã®æäœã§yieldãšé
åã®ã¿ã«äŸåããŠããŸãã ç¡å颿°ã«å ããŠãæååã©ã ãããµããŒãããŠããŸãã æç€ºãããã©ã€ãã©ãªã®äžã§æããããã«ãªãã®ïŒ4ã€ã®ã¯ã©ã¹ã®ã¿ãå«ãŸããŠããŸãã æ©èœã®-éåžžã«
å€§èŠæš¡ãªããã¥ã¡ã³ããMSDNããé©å¿ ã
Ginq- ãLINQ to Objectãã¯PHPã®DSLã«åœ±é¿ãäžããŸãã ã åæ§ã«ããªããžã§ã¯ãã®ã¯ãšãªã®ã¿ããµããŒãããŸãã SPLã€ãã¬ãŒã¿ã«åºã¥ããŠãããããPHP 5.3以éã®èŠä»¶ã ç¡å颿°ã«å ããŠãSymfonyããã®ãããããã£ã¢ã¯ã»ã¹ãããµããŒãããŸãã äžèŠæš¡ã®ã©ã€ãã©ãªïŒç§»æ€ãããã³ã¬ã¯ã·ã§ã³ãã³ã³ãã¬ãŒã¿ãããŒãšå€ã®ãã¢ãããã³.NETããã®ãã®ä»ã®ãã®ã åèš70ã¯ã©ã¹ã å¹³åçãªåŒã³åºãã®ããã¥ã¡ã³ãïŒããããã眲åã瀺ãããã ãã§ãã äž»ãªæ©èœã¯ã€ãã¬ãŒã¿ã§ããããã«ãããã©ã€ãã©ãªã䜿çšããŠãã¡ãœããã®ãã§ãŒã³ã®åœ¢åŒã§ã¯ãšãªãäœæãããã¹ããããã€ãã¬ãŒã¿ã䜿çšã§ããŸãã
Pinq -
PHPçµ±åã¯ãšãªãPHPçšã®å®éã®LINQã©ã€ãã©ãª ã ãªããžã§ã¯ããšããŒã¿ããŒã¹ãæäœã§ããå¯äžã®ã©ã€ãã©ãªïŒ
çè«çã«ã¯...ïŒã å¿å颿°ã®ã¿ããµããŒãããŸããã
PHP-Parserã䜿çšããŠã³ãŒããè§£æã§ããŸãã ããã¥ã¡ã³ãã¯ïŒè©³çްãªå Žåã§ãïŒæã詳现ã§ã¯ãããŸããããçŽ æŽãããWebãµã€ãããããŸãã æç€ºããããã®ã®äžã§æãå€§èŠæš¡ãªã©ã€ãã©ãªïŒ500ãè¶
ããã¯ã©ã¹ã§ã150ã®ãã¹ãã¯ã©ã¹ãã«ãŠã³ãããŠããŸããïŒæ£çŽãªãšãããç§ã¯ã³ãŒããæãã®ã§å
¥ãããšãããŸããã§ããïŒã
ãã¹ãããã³å質ã®ãã®ä»ã®å
åã瀺ãããã©ã€ãã©ãªã¯ãã¹ãŠåé¡ãããŸããã æ°žä¹
ã©ã€ã»ã³ã¹ïŒBSDãMITã ãã¹ãŠãComposerããµããŒãããPackagistã«è¡šç€ºãããŸãã
ãã¹ã以éã颿°ã®é
åã
benchmark_linq_groups
_linq_groups颿°ã«æž¡ãããŸãïŒãã€ãããPHPãYaLinqoãGinqãããã³Pinqããããã
ãã¹ãã¯ãPHP 5.5.14ãWindows 7 SP1ã§å®è¡ãããŸãã ãã¹ãã¯ãèã®äžãã§è¡ããããããéã®ã¹ããã¯ã¯æã¡èŸŒã¿ãŸãããã¿ã¹ã¯ã¯ãæå€±ãç®ã§è©äŸ¡ããããšã§ãããããªã¡ãŒãã«åäœã§ãã¹ãŠã枬å®ããããšã§ã¯ãããŸããã æ£ç¢ºãªãã¹ããå¿
èŠãªå Žåã¯ãgithubã§ãœãŒã¹ã³ãŒããå
¥æã§ããŸãããããæ¹åããŠããã«ãªã¯ãšã¹ããåãå
¥ããŸãã
æªããšããããå§ããŸããã-çŽç²ãªãªãŒããŒãããã
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; }, ]);
Pinqã«ã¯
range
颿°ããããŸãã;ããã¥ã¡ã³ãã«ã¯æšæºé¢æ°ã䜿çšããããã«èšèŒãããŠããŸãã å®éãç§ãã¡ã¯ããããã£ãŠããŸãã
ãããŠçµæïŒ
1000ãè¶
ããintã®ç¹°ãè¿ã
------------------------
PHP [for] 0.00006ç§x1.0ïŒ100ïŒ
ïŒ
PHP [é
å颿°] 0.00011ç§x1.8ïŒ+ 83ïŒ
ïŒ
YaLinqo 0.00041ç§x6.8ïŒ+ 583ïŒ
ïŒ
Ginq 0.00075ç§x 12.5ïŒ+ 1150ïŒ
ïŒ
Pinq 0.00169ç§x28.2ïŒ+ 2717ïŒ
ïŒ
ã€ãã¬ãŒã¿ã¯å®¹èµŠãªãé床ãé£ã¹ãã
ããããã¯ããã«å°è±¡çãªã®ã¯ãæåŸã®ã©ã€ãã©ãªã§ã®é床ã®ã²ã©ãèœã¡èŸŒã¿ã§ãã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(); }, ]);
ãããŠçµæïŒ
1000åã®æŽæ°ã®é
åã®çæ
---------------------------------
PHP [for] 0.00025ç§x1.3ïŒ+ 32ïŒ
ïŒ
PHP [é
å颿°] 0.00019ç§x1.0ïŒ100ïŒ
ïŒ
YaLinqo 0.00060ç§x3.2ïŒ+ 216ïŒ
ïŒ
Ginq 0.00107ç§x5.6ïŒ+ 463ïŒ
ïŒ
Pinq 0.00183ç§x9.6ïŒ+ 863ïŒ
ïŒ
çŸåšãYaLinqoã¯ããµã€ã¯ã«ã§ã®é¡ã®æ±ºå®ã®2åãã倱ããŸããã ä»ã®ã©ã€ãã©ãªã®çµæã¯ããã«æªãã§ãããçããããšã¯ã§ããŸãã
次ã«ããã¹ãããŒã¿ã§èšç®ãè¡ããŸããæ³šæãã€ã³ãã5ã€ä»¥äžããæ³šæãã«ãŠã³ãããŸãã 5ã€ä»¥äžã®ã¢ã€ãã ã3ã€ä»¥äžããæ³šæãã«ãŠã³ãããŸãã
benchmark_linq_groups("Counting values in arrays", 100, null, [ "for" => function () use ($DATA) { $numberOrders = 0; foreach ($DATA->orders as $order) { if (count($order['items']) > 5) $numberOrders++; } return $numberOrders; }, "array functions" => function () use ($DATA) { return count( array_filter( $DATA->orders, function ($order) { return count($order['items']) > 5; } ) ); }, ], [ function () use ($DATA) { return E::from($DATA->orders) ->count(function ($order) { return count($order['items']) > 5; }); }, "string lambda" => function () use ($DATA) { return E::from($DATA->orders) ->count('$o ==> count($o["items"]) > 5'); }, ], [ function () use ($DATA) { return G::from($DATA->orders) ->count(function ($order) { return count($order['items']) > 5; }); }, ], [ function () use ($DATA) { return P::from($DATA->orders) ->where(function ($order) { return count($order['items']) > 5; }) ->count(); }, ]); benchmark_linq_groups("Counting values in arrays deep", 100, null, [ "for" => function () use ($DATA) { $numberOrders = 0; foreach ($DATA->orders as $order) { $numberItems = 0; foreach ($order['items'] as $item) { if ($item['quantity'] > 5) $numberItems++; } if ($numberItems > 2) $numberOrders++; } return $numberOrders; }, "array functions" => function () use ($DATA) { return count( array_filter( $DATA->orders, function ($order) { return count( array_filter( $order['items'], function ($item) { return $item['quantity'] > 5; } ) ) > 2; }) ); }, ], [ function () use ($DATA) { return E::from($DATA->orders) ->count(function ($order) { return E::from($order['items']) ->count(function ($item) { return $item['quantity'] > 5; }) > 2; }); }, ], [ function () use ($DATA) { return G::from($DATA->orders) ->count(function ($order) { return G::from($order['items']) ->count(function ($item) { return $item['quantity'] > 5; }) > 2; }); }, ], [ function () use ($DATA) { return P::from($DATA->orders) ->where(function ($order) { return P::from($order['items']) ->where(function ($item) { return $item['quantity'] > 5; }) ->count() > 2; }) ->count(); }, ]);
èãã3ã€ã®ãã¥ã¢ã³ã¹ã ãŸããé
åã®æšæºé¢æ°ã®é¢æ°ã¹ã¿ã€ã«ã«ãããã³ãŒããæ¥œããèªããªãã©ããŒã«å€ãããŸãã 第äºã«ããšã¹ã±ãŒããããã³ãŒãå
ã®ã³ãŒãã®ãšã¹ã±ãŒãã¯è³ã®é€å»ã§ãããããæååã©ã ãã¯äœ¿çšã§ããŸããã 第äžã«ãPinqã«ã¯è¿°èªãåã
count
颿°ãçšæãããŠããªããããã¡ãœããã®ãã§ãŒã³ãæ§ç¯ããå¿
èŠããããŸãã åŸã§å€æããããã«ãããã¯Pinqã®å¯äžã®å¶éããã¯ã»ã©é ãã§ãïŒã¡ãœãããéåžžã«å°ãªããéåžžã«å¶éãããŠããŸãã
çµæã確èªããŸãã
é
åã®å€ãæ°ãã
-------------------------
PHP [for] 0.00023ç§x1.0ïŒ100ïŒ
ïŒ
PHP [é
å颿°] 0.00052ç§x2.3ïŒ+ 126ïŒ
ïŒ
YaLinqo 0.00056ç§x2.4ïŒ+ 143ïŒ
ïŒ
YaLinqo [æååã©ã ã] 0.00059ç§x2.6ïŒ+ 157ïŒ
ïŒ
Ginq 0.00129ç§x5.6ïŒ+ 461ïŒ
ïŒ
Pinq 0.00382ç§x16.6ïŒ+ 1561ïŒ
ïŒ
é
åã®å€ãæ·±ãã«ãŠã³ããã
------------------------------
PHP [for] 0.00064ç§x1.0ïŒ100ïŒ
ïŒ
PHP [é
å颿°] 0.00323ç§x5.0ïŒ+ 405ïŒ
ïŒ
YaLinqo 0.00798ç§x12.5ïŒ+ 1147ïŒ
ïŒ
Ginq 0.01416ç§x22.1ïŒ+ 2113ïŒ
ïŒ
Pinq 0.04928ç§x77.0ïŒ+ 7600ïŒ
ïŒ
æãããPinqã®çµæã¯å¥ãšããŠãçµæã¯å€ããå°ãªããäºæž¬å¯èœã§ãã ç§ã¯ã³ãŒããèŠãŸããã ã³ã¬ã¯ã·ã§ã³å
šäœãããã§çæãããæ¬¡ã«
count()
ãåŒã³åºãããŸã...ããããããã§ãé©ãã«ã¯æ©ãããŸãïŒ
ãã£ã«ã¿ãªã³ã°ãããŸãããã ãã¹ãŠã¯ååãšåãã§ãããã«ãŠã³ããã代ããã«ã³ã¬ã¯ã·ã§ã³ãçæããŸãã
benchmark_linq_groups("Filtering values in arrays", 100, 'consume', [ "for" => function () use ($DATA) { $filteredOrders = [ ]; foreach ($DATA->orders as $order) { if (count($order['items']) > 5) $filteredOrders[] = $order; } return $filteredOrders; }, "array functions" => function () use ($DATA) { return array_filter( $DATA->orders, function ($order) { return count($order['items']) > 5; } ); }, ], [ function () use ($DATA) { return E::from($DATA->orders) ->where(function ($order) { return count($order['items']) > 5; }); }, "string lambda" => function () use ($DATA) { return E::from($DATA->orders) ->where('$order ==> count($order["items"]) > 5'); }, ], [ function () use ($DATA) { return G::from($DATA->orders) ->where(function ($order) { return count($order['items']) > 5; }); }, ], [ function () use ($DATA) { return P::from($DATA->orders) ->where(function ($order) { return count($order['items']) > 5; }); }, ]); benchmark_linq_groups("Filtering values in arrays deep", 100, function ($e) { consume($e, [ 'items' => null ]); }, [ "for" => function () use ($DATA) { $filteredOrders = [ ]; foreach ($DATA->orders as $order) { $filteredItems = [ ]; foreach ($order['items'] as $item) { if ($item['quantity'] > 5) $filteredItems[] = $item; } if (count($filteredItems) > 0) { $order['items'] = $filteredItems; $filteredOrders[] = [ 'id' => $order['id'], 'items' => $filteredItems, ]; } } return $filteredOrders; }, "array functions" => function () use ($DATA) { return array_filter( array_map( function ($order) { return [ 'id' => $order['id'], 'items' => array_filter( $order['items'], function ($item) { return $item['quantity'] > 5; } ) ]; }, $DATA->orders ), function ($order) { return count($order['items']) > 0; } ); }, ], [ function () use ($DATA) { return E::from($DATA->orders) ->select(function ($order) { return [ 'id' => $order['id'], 'items' => E::from($order['items']) ->where(function ($item) { return $item['quantity'] > 5; }) ->toArray() ]; }) ->where(function ($order) { return count($order['items']) > 0; }); }, "string lambda" => function () use ($DATA) { return E::from($DATA->orders) ->select(function ($order) { return [ 'id' => $order['id'], 'items' => E::from($order['items'])->where('$v["quantity"] > 5')->toArray() ]; }) ->where('count($v["items"]) > 0'); }, ], [ function () use ($DATA) { return G::from($DATA->orders) ->select(function ($order) { return [ 'id' => $order['id'], 'items' => G::from($order['items']) ->where(function ($item) { return $item['quantity'] > 5; }) ->toArray() ]; }) ->where(function ($order) { return count($order['items']) > 0; }); }, ], [ function () use ($DATA) { return P::from($DATA->orders) ->select(function ($order) { return [ 'id' => $order['id'], 'items' => P::from($order['items']) ->where(function ($item) { return $item['quantity'] > 5; }) ->asArray() ]; }) ->where(function ($order) { return count($order['items']) > 0; }); }, ]);
é
åã®é¢æ°ã®ã³ãŒãã¯ããã§ã«èããèãããå§ããŠããŸãã ç¹ã«ã
array_map
ãš
array_filter
åŒæ°
array_filter
ç°ãªãããããã®åŸã«äœãèµ·ããããææ¡ããã®ã¯å°é£ã§ãã
ã¯ãšãªã䜿çšããã³ãŒãã¯ãæå³çã«æé©æ§ãäœããªããŸãããªããžã§ã¯ãã¯ããã®åŸé€å€ãããŠãçæãããŸãã ããã¯äžè¬ã«ãLINQã®äŒçµ±ã§ãããäžéã®èšç®çµæãšãšãã«ãå¿ååãã®äœæã䌎ããŸãã
çµæã¯ã以åã®ãã¹ããšæ¯èŒãããšãããªãåäžã§ãã
é
åå
ã®å€ã®ãã£ã«ã¿ãªã³ã°
--------------------------
PHP [for] 0.00049ç§x1.0ïŒ100ïŒ
ïŒ
PHP [é
å颿°] 0.00072ç§x1.5ïŒ+ 47ïŒ
ïŒ
YaLinqo 0.00094ç§x1.9ïŒ+ 92ïŒ
ïŒ
YaLinqo [æååã©ã ã] 0.00094ç§x1.9ïŒ+ 92ïŒ
ïŒ
Ginq 0.00295ç§x6.0ïŒ+ 502ïŒ
ïŒ
Pinq 0.00328ç§x6.7ïŒ+ 569ïŒ
ïŒ
é
åã®å€ãæ·±ããã£ã«ã¿ãªã³ã°ãã
-------------------------------
PHP [for] 0.00514ç§x1.0ïŒ100ïŒ
ïŒ
PHP [é
å颿°] 0.00739ç§x1.4ïŒ+ 44ïŒ
ïŒ
YaLinqo 0.01556ç§x3.0ïŒ+ 203ïŒ
ïŒ
YaLinqo [æååã©ã ã] 0.01750ç§x3.4ïŒ+ 240ïŒ
ïŒ
Ginq 0.03101ç§x6.0ïŒ+ 503ïŒ
ïŒ
Pinq 0.05435ç§x10.6ïŒ+ 957ïŒ
ïŒ
ãœãŒãã«ç§»ããŸãããïŒ
benchmark_linq_groups("Sorting arrays", 100, 'consume', [ function () use ($DATA) { $orderedUsers = $DATA->users; usort( $orderedUsers, function ($a, $b) { $diff = $a['rating'] - $b['rating']; if ($diff !== 0) return -$diff; $diff = strcmp($a['name'], $b['name']); if ($diff !== 0) return $diff; $diff = $a['id'] - $b['id']; return $diff; }); return $orderedUsers; }, ], [ function () use ($DATA) { return E::from($DATA->users) ->orderByDescending(function ($u) { return $u['rating']; }) ->thenBy(function ($u) { return $u['name']; }) ->thenBy(function ($u) { return $u['id']; }); }, "string lambda" => function () use ($DATA) { return E::from($DATA->users)->orderByDescending('$v["rating"]')->thenBy('$v["name"]')->thenBy('$v["id"]'); }, ], [ function () use ($DATA) { return G::from($DATA->users) ->orderByDesc(function ($u) { return $u['rating']; }) ->thenBy(function ($u) { return $u['name']; }) ->thenBy(function ($u) { return $u['id']; }); }, "property path" => function () use ($DATA) { return G::from($DATA->users)->orderByDesc('[rating]')->thenBy('[name]')->thenBy('[id]'); }, ], [ function () use ($DATA) { return P::from($DATA->users) ->orderByDescending(function ($u) { return $u['rating']; }) ->thenByAscending(function ($u) { return $u['name']; }) ->thenByAscending(function ($u) { return $u['id']; }); }, ]);
usort
ã®æ¯èŒé¢æ°ã®ã³ãŒã
usort
èŠèŠããã§ãããæ
£ããŠããŸã£ãã®ã§ããã®ãããªé¢æ°ãããããããšãªãæžãããšãã§ããŸãã LINQãœãŒãã¯ã»ãŒå®å
šã«ãããã«èŠããŸãã ãŸããGinqã®ãããããã£ãžã®ã¢ã¯ã»ã¹ããå©çšã§ããã®ã¯ãããåããŠã§ãããã以äžã³ãŒããäœæããããšã¯ã§ããŸããã
çµæã¯é©ãã¹ããã®ã§ãã
é
åã®äžŠã¹æ¿ã
--------------
PHP 0.00037ç§x1.0ïŒ100ïŒ
ïŒ
YaLinqo 0.00161ç§x4.4ïŒ+ 335ïŒ
ïŒ
YaLinqo [æååã©ã ã] 0.00163ç§x4.4ïŒ+ 341ïŒ
ïŒ
Ginq 0.00402ç§x10.9ïŒ+ 986ïŒ
ïŒ
Ginq [ããããã£ãã¹] 0.01998ç§x54.0ïŒ+ 5300ïŒ
ïŒ
Pinq 0.00132ç§x3.6ïŒ+ 257ïŒ
ïŒ
ãŸããPinqã¯ãããã§ã¯ãããŸããåé²ããŠããŸãã ãã¿ãã¬ïŒããã¯æåãšæåŸã«èµ·ãããŸããã
第äºã«ãGinqã®ããããã£ã«ã¢ã¯ã»ã¹ãããšãã²ã©ãããã©ãŒãã³ã¹ãäœäžããŸããã€ãŸããå®éã®ã³ãŒãã§ã¯ãã®æ©èœãå©çšã§ããŸããã æ§æã¯ã50åã®é床ã倱ã䟡å€ã¯ãããŸããã
ç§ãã¡ã¯æ¥œãã¿ã«ç®ãåããŸã-åå ããã«ã¯ãå¥åããŒã«ãã2ã€ã®ã³ã¬ã¯ã·ã§ã³ã®çµã¿åããã
benchmark_linq_groups("Joining arrays", 100, 'consume', [ function () use ($DATA) { $usersByIds = [ ]; foreach ($DATA->users as $user) $usersByIds[$user['id']][] = $user; $pairs = [ ]; foreach ($DATA->orders as $order) { $id = $order['customerId']; if (isset($usersByIds[$id])) { foreach ($usersByIds[$id] as $user) { $pairs[] = [ 'order' => $order, 'user' => $user, ]; } } } return $pairs; }, ], [ function () use ($DATA) { return E::from($DATA->orders) ->join($DATA->users, function ($o) { return $o['customerId']; }, function ($u) { return $u['id']; }, function ($o, $u) { return [ 'order' => $o, 'user' => $u, ]; }); }, "string lambda" => function () use ($DATA) { return E::from($DATA->orders) ->join($DATA->users, '$o ==> $o["customerId"]', '$u ==> $u["id"]', '($o, $u) ==> [ "order" => $o, "user" => $u, ]'); }, ], [ function () use ($DATA) { return G::from($DATA->orders) ->join($DATA->users, function ($o) { return $o['customerId']; }, function ($u) { return $u['id']; }, function ($o, $u) { return [ 'order' => $o, 'user' => $u, ]; }); }, "property path" => function () use ($DATA) { return G::from($DATA->orders) ->join($DATA->users, '[customerId]', '[id]', function ($o, $u) { return [ 'order' => $o, 'user' => $u, ]; }); }, ], [ function () use ($DATA) { return P::from($DATA->orders) ->join($DATA->users) ->onEquality( function ($o) { return $o['customerId']; }, function ($u) { return $u['id']; } ) ->to(function ($o, $u) { return [ 'order' => $o, 'user' => $u, ]; }); }, ]);
Pinqã¯æ§æçã«éç«ã£ãŠããã1ã€ã®åºæ¬çãªæ©èœãããã€ãã®åŒã³åºãã«åå²ãããŠããŸãã ããããããã¯èªã¿ãããã§ãããLINQã«æ
£ããã¡ãœããã®å Žåããã®æ§æã¯ããŸã銎æã¿ããªããããããŸããã
ãããŠ...çµæïŒ
é
åã®çµå
--------------
PHP 0.00021ç§x1.0ïŒ100ïŒ
ïŒ
YaLinqo 0.00065ç§x3.1ïŒ+ 210ïŒ
ïŒ
YaLinqo [æååã©ã ã] 0.00070ç§x3.3ïŒ+ 233ïŒ
ïŒ
Ginq 0.00103ç§x4.9ïŒ+ 390ïŒ
ïŒ
Ginq [ããããã£ãã¹] 0.00200ç§x9.5ïŒ+ 852ïŒ
ïŒ
Pinq 1.24155ç§x5,911.8ïŒ+ 591084ïŒ
ïŒ
ããããééãã¯ãããŸããã Pinqã¯å®éã«é床ã6ååæ®ºããŸãã æåã¯ã¹ã¯ãªããããã³ã°ããŠãããšæã£ãŠããŸããããæçµçã«ã¯çµäºãããã®æ³åãçµ¶ããæ°ãäžããŸããã Pinqã®ãœãŒã¹ã³ãŒãã§ãã®äžé£ã®é¢æ°ã®ã³ãŒããã©ãã«ãããã¯ããããŸããã§ããããèŸæžã®é
åããªãfor-for-ifããããšæããŠããŸãã ããã«OOPããããŸãã
ãã1ã€ã®ç°¡åãªãã¹ã-éèšïŒãŸãã¯çޝç©ãç³ã¿èŸŒã¿-奜ããªããã«ïŒãèããŠã¿ãŸãããïŒ
benchmark_linq_groups("Aggregating arrays", 100, null, [ "for" => function () use ($DATA) { $sum = 0; foreach ($DATA->products as $p) $sum += $p['quantity']; $avg = 0; foreach ($DATA->products as $p) $avg += $p['quantity']; $avg /= count($DATA->products); $min = PHP_INT_MAX; foreach ($DATA->products as $p) $min = min($min, $p['quantity']); $max = -PHP_INT_MAX; foreach ($DATA->products as $p) $max = max($max, $p['quantity']); return "$sum-$avg-$min-$max"; }, "array functions" => function () use ($DATA) { $sum = array_sum(array_map(function ($p) { return $p['quantity']; }, $DATA->products)); $avg = array_sum(array_map(function ($p) { return $p['quantity']; }, $DATA->products)) / count($DATA->products); $min = min(array_map(function ($p) { return $p['quantity']; }, $DATA->products)); $max = max(array_map(function ($p) { return $p['quantity']; }, $DATA->products)); return "$sum-$avg-$min-$max"; }, ], [ function () use ($DATA) { $sum = E::from($DATA->products)->sum(function ($p) { return $p['quantity']; }); $avg = E::from($DATA->products)->average(function ($p) { return $p['quantity']; }); $min = E::from($DATA->products)->min(function ($p) { return $p['quantity']; }); $max = E::from($DATA->products)->max(function ($p) { return $p['quantity']; }); return "$sum-$avg-$min-$max"; }, "string lambda" => function () use ($DATA) { $sum = E::from($DATA->products)->sum('$v["quantity"]'); $avg = E::from($DATA->products)->average('$v["quantity"]'); $min = E::from($DATA->products)->min('$v["quantity"]'); $max = E::from($DATA->products)->max('$v["quantity"]'); return "$sum-$avg-$min-$max"; }, ], [ function () use ($DATA) { $sum = G::from($DATA->products)->sum(function ($p) { return $p['quantity']; }); $avg = G::from($DATA->products)->average(function ($p) { return $p['quantity']; }); $min = G::from($DATA->products)->min(function ($p) { return $p['quantity']; }); $max = G::from($DATA->products)->max(function ($p) { return $p['quantity']; }); return "$sum-$avg-$min-$max"; }, "property path" => function () use ($DATA) { $sum = G::from($DATA->products)->sum('[quantity]'); $avg = G::from($DATA->products)->average('[quantity]'); $min = G::from($DATA->products)->min('[quantity]'); $max = G::from($DATA->products)->max('[quantity]'); return "$sum-$avg-$min-$max"; }, ], [ function () use ($DATA) { $sum = P::from($DATA->products)->sum(function ($p) { return $p['quantity']; }); $avg = P::from($DATA->products)->average(function ($p) { return $p['quantity']; }); $min = P::from($DATA->products)->minimum(function ($p) { return $p['quantity']; }); $max = P::from($DATA->products)->maximum(function ($p) { return $p['quantity']; }); return "$sum-$avg-$min-$max"; }, ]); benchmark_linq_groups("Aggregating arrays custom", 100, null, [ function () use ($DATA) { $mult = 1; foreach ($DATA->products as $p) $mult *= $p['quantity']; return $mult; }, ], [ function () use ($DATA) { return E::from($DATA->products)->aggregate(function ($a, $p) { return $a * $p['quantity']; }, 1); }, "string lambda" => function () use ($DATA) { return E::from($DATA->products)->aggregate('$a * $v["quantity"]', 1); }, ], [ function () use ($DATA) { return G::from($DATA->products)->aggregate(1, function ($a, $p) { return $a * $p['quantity']; }); }, ], [ function () use ($DATA) { return P::from($DATA->products) ->select(function ($p) { return $p['quantity']; }) ->aggregate(function ($a, $q) { return $a * $q; }); }, ]);
颿°ã®æåã®ã»ããã«ã¯èª¬æãããã®ããããŸããã å¯äžã®ããšã¯ããã¹ãŠã®ã±ãŒã¹ã§èšç®ãå¥ã
ã®ãã¹ã«åå²ããããšã§ãã
2çªç®ã®ã»ããã§ã¯ã補åãèšç®ãããŸãã Pinqã¯åã³å€±æããŸããïŒéå§å€ãåãåããªãŒããŒããŒããæäŸããã代ããã«åžžã«æåã®èŠçŽ ãåãåãïŒèŠçŽ ããªãå Žåã¯nullãè¿ããäŸå€ãã¹ããŒããŸãã...ïŒãçµæãšããŠãå€ã远å ã§ãããããå¿
èŠããããŸãã
çµæïŒ
é
åã®éçŽ
------------------
PHP [for] 0.00059ç§x1.0ïŒ100ïŒ
ïŒ
PHP [é
å颿°] 0.00193ç§x3.3ïŒ+ 227ïŒ
ïŒ
YaLinqo 0.00475ç§x8.1ïŒ+ 705ïŒ
ïŒ
YaLinqo [æååã©ã ã] 0.00515ç§x8.7ïŒ+ 773ïŒ
ïŒ
ãžã³ã¯0.00669ç§x11.3ïŒ+ 1034ïŒ
ïŒ
Ginq [ããããã£ãã¹] 0.03955ç§x67.0ïŒ+ 6603ïŒ
ïŒ
Pinq 0.03226ç§x54.7ïŒ+ 5368ïŒ
ïŒ
é
åã®éèšã«ã¹ã¿ã
-------------------------
PHP 0.00007ç§x1.0ïŒ100ïŒ
ïŒ
YaLinqo 0.00046ç§x6.6ïŒ+ 557ïŒ
ïŒ
YaLinqo [æååã©ã ã] 0.00057ç§x8.1ïŒ+ 714ïŒ
ïŒ
ãžã³ã¯0.00046ç§x6.6ïŒ+ 557ïŒ
ïŒ
Pinq 0.00610ç§x87.1ïŒ+ 8615ïŒ
ïŒ
Ginqã®Pinqãšæååã®ããããã£ã¯èŠèŠããçµæã瀺ããYaLinqoã¯æ²ãã¿ãçµã¿èŸŒã¿é¢æ°ã¯æ²æšãªçµæããããããŸããã å»å¢ççšã
ããŠããã¶ãŒãã®å ŽåãReadMe YaLinqoã®äŸã¯ããã¹ãŠã®æ©èœãçµã¿åããããªã¯ãšã¹ãã§ãã
benchmark_linq_groups("Process data from ReadMe example", 5, function ($e) { consume($e, [ 'products' => null ]); }, [ function () use ($DATA) { $productsSorted = [ ]; foreach ($DATA->products as $product) { if ($product['quantity'] > 0) { if (empty($productsSorted[$product['catId']])) $productsSorted[$product['catId']] = [ ]; $productsSorted[$product['catId']][] = $product; } } foreach ($productsSorted as $catId => $products) { usort($productsSorted[$catId], function ($a, $b) { $diff = $a['quantity'] - $b['quantity']; if ($diff != 0) return -$diff; $diff = strcmp($a['name'], $b['name']); return $diff; }); } $result = [ ]; $categoriesSorted = $DATA->categories; usort($categoriesSorted, function ($a, $b) { return strcmp($a['name'], $b['name']); }); foreach ($categoriesSorted as $category) { $categoryId = $category['id']; $result[$category['id']] = [ 'name' => $category['name'], 'products' => isset($productsSorted[$categoryId]) ? $productsSorted[$categoryId] : [ ], ]; } return $result; }, ], [ function () use ($DATA) { return E::from($DATA->categories) ->orderBy(function ($cat) { return $cat['name']; }) ->groupJoin( from($DATA->products) ->where(function ($prod) { return $prod['quantity'] > 0; }) ->orderByDescending(function ($prod) { return $prod['quantity']; }) ->thenBy(function ($prod) { return $prod['name']; }), function ($cat) { return $cat['id']; }, function ($prod) { return $prod['catId']; }, function ($cat, $prods) { return array( 'name' => $cat['name'], 'products' => $prods ); } ); }, "string lambda" => function () use ($DATA) { return E::from($DATA->categories) ->orderBy('$cat ==> $cat["name"]') ->groupJoin( from($DATA->products) ->where('$prod ==> $prod["quantity"] > 0') ->orderByDescending('$prod ==> $prod["quantity"]') ->thenBy('$prod ==> $prod["name"]'), '$cat ==> $cat["id"]', '$prod ==> $prod["catId"]', '($cat, $prods) ==> [ "name" => $cat["name"], "products" => $prods ]'); }, ], [ function () use ($DATA) { return G::from($DATA->categories) ->orderBy(function ($cat) { return $cat['name']; }) ->groupJoin( G::from($DATA->products) ->where(function ($prod) { return $prod['quantity'] > 0; }) ->orderByDesc(function ($prod) { return $prod['quantity']; }) ->thenBy(function ($prod) { return $prod['name']; }), function ($cat) { return $cat['id']; }, function ($prod) { return $prod['catId']; }, function ($cat, $prods) { return array( 'name' => $cat['name'], 'products' => $prods ); } ); }, ], [ function () use ($DATA) { return P::from($DATA->categories) ->orderByAscending(function ($cat) { return $cat['name']; }) ->groupJoin( P::from($DATA->products) ->where(function ($prod) { return $prod['quantity'] > 0; }) ->orderByDescending(function ($prod) { return $prod['quantity']; }) ->thenByAscending(function ($prod) { return $prod['name']; }) ) ->onEquality( function ($cat) { return $cat['id']; }, function ($prod) { return $prod['catId']; } ) ->to(function ($cat, $prods) { return array( 'name' => $cat['name'], 'products' => $prods ); }); }, ]);
裞ã®PHPã®ã³ãŒãã¯ãããHabréã§ã®äžè¬çãªåªåã«ãã£ãŠæžãããŠããŸããçµæïŒ
ReadMeã®äŸããã®ããã»ã¹ããŒã¿
--------------------------------
PHP 0.00620ç§x1.0ïŒ100ïŒ
ïŒ
YaLinqo 0.02840ç§x4.6ïŒ+ 358ïŒ
ïŒ
YaLinqo [æååã©ã ã] 0.02920ç§x4.7ïŒ+ 371ïŒ
ïŒ
Ginq 0.07720ç§x12.5ïŒ+ 1145ïŒ
ïŒ
ãã³ãã¥ãŒ2.71616ç§x438.1ïŒ+ 43707ïŒ
ïŒ
GroupJoinã¯Pinqã®ããã©ãŒãã³ã¹ãäœäžãããŸãããæ®ãã¯å€ããå°ãªããæåŸ
ãããçµæã瀺ããŸãããã©ã€ãã©ãªã®è©³çްPinqã¯ãPHPãè§£æããŠSQLã¯ãšãªãçæã§ããå¯äžã®ã©ã€ãã©ãªã§ããããããã®æ©èœãèæ
®ããªããšèšäºã¯äžå®å
šã«ãªããŸããæ®å¿µãªããã倿ããããã«ãå¯äžã®ãããã€ããŒã¯MySQLçšã§ãããããã¢ãã®åœ¢åŒã«ãªã£ãŠããŸããå®éããã®æ©èœã¯å®£èšãããŠãããPinqã«åºã¥ããŠå®è£
ã§ããŸãããå®éã«ã¯äœ¿çšããããšã¯ã§ããŸãããçµè«WebãµãŒãã¹ããåãåã£ã100ã€ã2ã€ã®çµæããã°ããé€å€ããå¿
èŠãããå ŽåãLINQã©ã€ãã©ãªã¯ããŒãºãååã«æºããããšãã§ããŸããã©ã€ãã©ãªãŒã®äžã§ãããã©ãŒãã³ã¹ã«ãããè°è«ã®äœå°ã®ãªãåè
ã¯YaLinqoã§ããã¯ãšãªã䜿çšããŠãªããžã§ã¯ãããã£ã«ã¿ãªã³ã°ããå¿
èŠãããå Žåããããæãè«ççãªéžæã§ããGinqã¯ãã¡ãœããã®ãã§ãŒã³ã§ã¯ãªããã¹ããããã€ãã¬ãŒã¿ãŒã䜿çšããããšã奜ã人ã«ã¢ããŒã«ãããããããŸããããã®ãããªSPLã€ãã¬ãŒã¿ãŒã®æå¥œå®¶ããããã©ããã¯ããããŸãããPinqã¯å·šå€§ãªã©ã€ãã©ãªã§ããããšã倿ããŸãããå€ãã®æœè±¡åå±€ã«ãããããããããã€ãã®æ©èœãããããããã»ã©å®è£
ãããŠããŸãããã®ã©ã€ãã©ãªã¯ãããŒã¿ããŒã¹ã¯ãšãªã®ãµããŒãã«ããå¯èœæ§ããããŸãããçŸæç¹ã§ã¯ãŸã å®çŸãããŠããŸãããããŒã¿ããŒã¹ãžã®ã¯ãšãªãå¿
èŠãªå Žåãå¯äžã®ãªãã·ã§ã³-PHPLinqããããŸããããããéåžžã®ORMã©ã€ãã©ãªããããããéåžžã«çãããå質ã®ã©ã€ãã©ãªã䜿çšããæå³ã¯ãããŸãããåç
§è³æ- YaLinqo -YaLinqoã©ã€ãã©ãª
- YaLinqo Docs -YaLinqoã©ã€ãã©ãªããã¥ã¡ã³ã
- YaLinqoããã©ãŒãã³ã¹-YaLinqoãGinqãPinqããã©ãŒãã³ã¹ãã¹ã
- Ginq -Ginqã©ã€ãã©ãª
- Pinq -Pinqã©ã€ãã©ãª