loophp/memoize

缓存闭包

5.0.2 2021-01-17 10:29 UTC

This package is auto-updated.

Last update: 2024-08-24 12:48:20 UTC


README

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

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请求来为这个库做出贡献。