1
0
mirror of synced 2025-11-06 03:20:55 +08:00
Files
SnowFlake-IdGenerator/PHP/snowdrift.php
2021-04-07 11:51:02 +08:00

95 lines
2.5 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
declare(strict_types=1);
namespace SnowDrift;
use FFI;
use FFI\CData;
final class SnowFlake
{
private FFI $ffi;
private CData $flake;
private CData $pflake;
public function __construct(array $config = ['Method' => 1, 'BaseTime' => 0, 'WorkerId' => 1, 'WorkerIdBitLength' => 6, 'SeqBitLength' => 10, 'TopOverCostCount' => 2000])
{
$this->ffi = FFI::cdef(file_get_contents($this->getHeaders()), $this->getLibrary());
$this->flake = $this->ffi->new("struct snowflake");
foreach ($config as $name => $val) {
$this->flake->$name = $val;
}
$this->pflake = FFI::addr($this->flake);
$this->ffi->Config($this->pflake);
}
public function getFFI(): FFI
{
return $this->ffi;
}
public function getFlake(): CData
{
return $this->flake;
}
public function getPflake(): CData
{
return $this->pflake;
}
public function nextId(): int
{
return $this->ffi->NextId($this->pflake);
}
public function getHeaders(): string
{
return __DIR__ . '/src/snowflake/snowflake.h';
}
public function getLibrary(): ?string
{
return __DIR__ . '/src/snowflake/libsnow.so';
}
}
$total = 50000;
$snowflake = new SnowFlake(['Method' => 1, 'BaseTime' => 1577808000000, 'WorkerId' => 1, 'WorkerIdBitLength' => 1, 'SeqBitLength' => 10, 'TopOverCostCount' => 2000]);
$ffi = $snowflake->getFFI();
$pflake = $snowflake->getPflake();
// $res = [];
$start = microtime(true);
for ($i = 0; $i < $total; $i++) {
// $res[] = \SnowDrift::NextId();
\SnowDrift::NextId(2);
}
echo sprintf("扩展漂移算法,PHP循环获取%d%s ms", $total, ((microtime(true) - $start)) * 1000) . PHP_EOL;
// $res = [];
$start = microtime(true);
foreach (\SnowDrift::NextNumId($total) as $val) {
// $res[] = $val;
}
echo sprintf("扩展漂移算法,C循环获取%d%s ms", $total, ((microtime(true) - $start)) * 1000) . PHP_EOL;
// $res = [];
$start = microtime(true);
for ($i = 0; $i < $total; $i++) {
// $res[] = $ffi->NextId($pflake);
$ffi->NextId($pflake);
}
echo sprintf("FFI漂移算法,PHP循环获取%d%s ms", $total, ((microtime(true) - $start)) * 1000) . PHP_EOL;
// $res = [];
$start = microtime(true);
$tmp = $ffi->NextNumId($pflake, $total);
for ($i = 0; $i < $total; $i++) {
// $res[] = $tmp[$i];
}
echo sprintf("FFI漂移算法,C循环获取%d%s ms", $total, ((microtime(true) - $start)) * 1000) . PHP_EOL;