drupol / memoize

此包已被弃用,不再维护。作者建议使用 loophp/memoize 包。

缓存闭包。

资助包维护!
drupol

5.0.2 2021-01-17 10:29 UTC

README

Latest Stable Version GitHub stars Total Downloads GitHub Workflow Status Scrutinizer code quality Type Coverage Code Coverage License Donate! Donate!

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 来为此库做出贡献。