loophp / memoize
缓存闭包
5.0.2
2021-01-17 10:29 UTC
Requires
- php: >= 7.4
Requires (Dev)
- drupol/php-conventions: ^2.0.3
- friends-of-phpspec/phpspec-code-coverage: ^5
- infection/infection: ^0.20
- infection/phpspec-adapter: ^0.1.1
- loophp/phpspec-time: ^1.1
- phpspec/phpspec: ^7
- phpstan/phpstan-strict-rules: ^0.12
- vimeo/psalm: ^4
README
PHP Memoize
描述
用于可调用的Memoizer类。
来自维基百科
在计算机科学中,缓存是一种优化技术,主要用于通过存储昂贵的函数调用的结果,并在相同的输入再次出现时返回缓存的值来加速计算机程序。
这个库可以帮助您缓存可调用或闭包。
特性
- 提供Memoizer类。
- 不可变。
- 无状态。
安装
使用composer
composer require loophp/memoize
用法
<?php declare(strict_types=1); namespace App; include 'vendor/autoload.php'; use Closure; use Generator; use loophp\memoize\Memoizer; $fibonacci = static function (int $number) use (&$fibonacci): int { return (1 >= $number) ? $number : $fibonacci($number - 1) + $fibonacci($number - 2); }; $fibonacciMemoized = static function (int $number) use (&$fibonacciMemoized): int { return (1 >= $number) ? $number : $fibonacciMemoized($number - 1) + $fibonacciMemoized($number - 2); }; $fibonacciMemoized = Memoizer::fromClosure($fibonacciMemoized); function bench(Closure $closure, ...$arguments): array { $eval = static function (Closure $closure, ...$arguments): Generator { yield microtime(true); yield $closure(...$arguments); yield microtime(true); }; $result = iterator_to_array($eval($closure, ...$arguments)); return [ $result[1], $result[2] - $result[0], ]; } var_dump(sprintf('[return: %s] [duration: %s]', ...bench($fibonacci, 30))); // ~3 seconds var_dump(sprintf('[return: %s] [duration: %s]', ...bench($fibonacciMemoized, 30))); // ~0.0003 seconds
代码风格、代码质量、测试和基准测试
代码风格遵循PSR-12加上一组自定义规则,包drupol/php-conventions负责此。
每次向库中引入更改时,Github CI都会运行测试和基准测试。
库中包含使用PHPSpec编写的测试。您可以在spec
目录中自由检查它们。运行composer phpspec
以触发测试。
PHPInfection用于确保您的代码得到适当的测试,运行composer infection
以测试您的代码。
贡献
请参阅CONTRIBUTING.md文件,但您可以通过发送Github pull请求来为这个库做出贡献。