drupol / 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
描述
可调用对象的缓存类。
来自维基百科
在计算机科学中,缓存是一种优化技术,主要用于通过存储昂贵的函数调用结果并返回缓存结果来加速计算机程序。
此库可以帮助您缓存可调用对象或闭包。
特性
- 提供缓存类。
- 不可变。
- 无状态。
安装
使用 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 requests 来为此库做出贡献。