Skip to content

Commit

Permalink
Add performance tests
Browse files Browse the repository at this point in the history
  • Loading branch information
yethee committed Apr 30, 2024
1 parent d708a14 commit b9679f8
Show file tree
Hide file tree
Showing 8 changed files with 346 additions and 1 deletion.
1 change: 1 addition & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
/.editorconfig export-ignore
/.gitattributes export-ignore
/.gitignore export-ignore
/phpbench.json export-ignore
/*.xml export-ignore
/*.xml.dist export-ignore

Expand Down
4 changes: 3 additions & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
},
"require-dev": {
"doctrine/coding-standard": "^12.0",
"phpbench/phpbench": "^1.2",
"phpunit/phpunit": "^10.3",
"psalm/plugin-phpunit": "^0.19.0",
"vimeo/psalm": "5.23.1"
Expand Down Expand Up @@ -39,6 +40,7 @@
"analyse": "psalm --stats",
"cs-check": "phpcs",
"cs-fix": "phpcbf",
"test": "phpunit --colors=always --no-coverage"
"test": "phpunit --colors=always --no-coverage",
"bench": "phpbench run -l dots --report=encode --retry-threshold=5 --profile=jit"
}
}
25 changes: 25 additions & 0 deletions phpbench.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
{
"$schema":"./vendor/phpbench/phpbench/phpbench.schema.json",
"runner.bootstrap": "vendor/autoload.php",
"runner.path": "tests/Benchmark",
"core.profiles": {
"jit": {
"runner.php_config": {
"zend_extension": ["opcache"],
"opcache.enable_cli": 1,
"opcache.enable": 1,
"opcache.jit_buffer_size": "32M",
"opcache.jit": 1255,
"xdebug.mode": "off"
}
}
},
"storage.xml_storage_path": ".cache/phpbench/storage",
"report.generators": {
"encode": {
"generator": "expression",
"break": ["subject"],
"cols": ["benchmark", "subject", "set", "revs", "its", "mem_peak", "mode", "rstdev"]
}
}
}
7 changes: 7 additions & 0 deletions psalm-baseline.xml
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,11 @@
<code><![CDATA[non-empty-string]]></code>
</MoreSpecificReturnType>
</file>
<file src="tests/Benchmark/EncoderBench.php">
<MissingConstructor>
<code><![CDATA[$encoder]]></code>
<code><![CDATA[$text]]></code>
<code><![CDATA[$tokens]]></code>
</MissingConstructor>
</file>
</files>
73 changes: 73 additions & 0 deletions tests/Benchmark/EncoderBench.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
<?php

declare(strict_types=1);

namespace Yethee\Tiktoken\Tests\Benchmark;

use PhpBench\Attributes as Bench;
use Yethee\Tiktoken\Encoder;
use Yethee\Tiktoken\EncoderProvider;

use function dirname;
use function file_get_contents;

/** @psalm-api */
#[Bench\Iterations(5)]
#[Bench\Revs(100)]
#[Bench\Warmup(3)]
#[Bench\BeforeMethods('initialize')]
#[Bench\ParamProviders([
'provideEncodings',
'provideFixtures',
])]
final class EncoderBench
{
private const TEXTS = ['baconipsum', 'cyrillic', 'latin'];
private const ENCODINGS = ['p50k_base', 'cl100k_base'];

private Encoder $encoder;
private string $text;

/** @var list<int> */
private array $tokens;

/** @param array{fixture: non-empty-string, encoding: non-empty-string} $params */
public function initialize(array $params): void
{
$provider = new EncoderProvider();
$provider->setVocabCache(dirname(__DIR__, 2) . '/.cache/vocab');

$this->encoder = $provider->get($params['encoding']);

$this->text = file_get_contents(__DIR__ . '/fixtures/' . $params['fixture'] . '.txt');
$this->tokens = $this->encoder->encode($this->text);
}

#[Bench\Subject]
public function encode(): void
{
$this->encoder->encode($this->text);
}

#[Bench\Subject]
public function decode(): void
{
$this->encoder->decode($this->tokens);
}

/** @return iterable<array{encoding: non-empty-string}> */
public static function provideEncodings(): iterable
{
foreach (self::ENCODINGS as $encoding) {
yield $encoding => ['encoding' => $encoding];
}
}

/** @return iterable<array{fixture: non-empty-string}> */
public static function provideFixtures(): iterable
{
foreach (self::TEXTS as $text) {
yield $text => ['fixture' => $text];
}
}
}
199 changes: 199 additions & 0 deletions tests/Benchmark/fixtures/baconipsum.txt

Large diffs are not rendered by default.

19 changes: 19 additions & 0 deletions tests/Benchmark/fixtures/cyrillic.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
Проснувшись однажды утром после беспокойного сна, Грегор Замза обнаружил, что он у себя в постели превратился в страшное насекомое. Лежа на панцирнотвердой спине, он видел, стоило ему приподнять голову, свой коричневый, выпуклый, разделенный дугообразными чешуйками живот, на верхушке которого еле держалось готовое вот-вот окончательно сползти одеяло. Его многочисленные, убого тонкие по сравнению с остальным телом ножки беспомощно копошились у него перед глазами. «Что со мной случилось? » – подумал он. Это не было сном. Его комната, настоящая, разве что слишком маленькая, но обычная комната, мирно покоилась в своих четырех хорошо знакомых стенах.

Над столом, где были разложены распакованные образцы сукон – Замза был коммивояжером, – висел портрет, который он недавно вырезал из иллюстрированного журнала и вставил в красивую золоченую рамку. На портрете была изображена дама в меховой шляпе и боа, она сидела очень прямо и протягивала зрителю тяжелую меховую муфту, в которой целиком исчезала ее рука. Затем взгляд Грегора устремился в окно, и пасмурная погода – слышно было, как по жести подоконника стучат капли дождя – привела его и вовсе в грустное настроение.

«Хорошо бы еще немного поспать и забыть всю эту чепуху», – подумал он, но это было совершенно неосуществимо, он привык спать на правом боку, а в теперешнем своем состоянии он никак не мог принять этого положения. С какой бы силой ни поворачивался он на правый бок, он неизменно сваливался опять на спину. Закрыв глаза, чтобы не видеть своих барахтающихся ног, он проделал это добрую сотню раз и отказался от этих попыток только тогда, когда почувствовал какую-то неведомую дотоле, тупую и слабую боль в боку. «Ах ты, господи, – подумал он, – какую я выбрал хлопотную профессию! Изо дня в день в разъездах.

Деловых волнений куда больше, чем на месте, в торговом доме, а кроме того, изволь терпеть тяготы дороги, думай о расписании поездов, мирись с плохим, нерегулярным питанием, завязывай со все новыми и новыми людьми недолгие, никогда не бывающие сердечными отношения. Черт бы побрал все это! » Он почувствовал вверху живота легкий зуд; медленно подвинулся на спине к прутьям кровати, чтобы удобнее было поднять голову; нашел зудевшее место, сплошь покрытое, как оказалось, белыми непонятными точечками; хотел было ощупать это место одной из ножек, но сразу отдернул ее, ибо даже простое прикосновение вызвало у него, Грегора, озноб. Он соскользнул в прежнее свое положение.

«От этого раннего вставания, – подумал он, – можно совсем обезуметь. Человек должен высыпаться. Другие коммивояжеры живут, как одалиски. Когда я, например, среди дня возвращаюсь в гостиницу, чтобы переписать полученные заказы, эти господа только завтракают. А осмелься я вести себя так, мои хозяин выгнал бы меня сразу. Кто знает, впрочем, может быть, это было бы даже очень хорошо для меня. Если бы я не сдерживался ради родителей, я бы давно заявил об уходе, я бы подошел к своему хозяину и выложил ему все, что о нем думаю. Он бы так и свалился с конторки!

Странная у него манера – садиться на конторку и с ее высоты разговаривать со служащим, который вдобавок вынужден подойти вплотную к конторке из-за того, что хозяин туг на ухо. Однако надежда еще не совсем потеряна: как только я накоплю денег, чтобы выплатить долг моих родителей – на это уйдет еще лет пять-шесть, – я так и поступлю. Тут-то мы и распрощаемся раз и навсегда. А пока что надо подниматься, мой поезд отходит в пять». И он взглянул на будильник, который тикал на сундуке. «Боже правый! » – подумал он. Было половина седьмого, и стрелки спокойно двигались дальше, было даже больше половины, без малого уже три четверти. Неужели будильник не звонил?

С кровати было видно, что он поставлен правильно, на четыре часа; и он, несомненно, звонил. Но как можно было спокойно спать под этот сотрясающий мебель трезвон? Ну, спал-то он неспокойно, но, видимо, крепко. Однако что делать теперь? Следующий поезд уходит в семь часов; чтобы поспеть на него, он должен отчаянно торопиться, а набор образцов еще не упакован, да и сам он отнюдь не чувствует себя свежим и легким на подъем. И даже поспей он на поезд, хозяйского разноса ему все равно не избежать – ведь рассыльный торгового дома дежурил у пятичасового поезда и давно доложил о его, Грегора, опоздании. Рассыльный, человек бесхарактерный и неумный, был ставленником хозяина. А что, если сказаться больным?

Но это было бы крайне неприятно и показалось бы подозрительным, ибо за пятилетнюю свою службу Грегор ни разу еще не болел. Хозяин, конечно, привел бы врача больничной кассы и стал попрекать родителей сыном-лентяем, отводя любые возражения ссылкой на этого врача, по мнению которого все люди на свете совершенно здоровы и только не любят работать. И разве в данном случае он был бы так уж неправ? Если не считать сонливости, действительно странной после такого долгого сна, Грегор и в самом деле чувствовал себя превосходно и был даже чертовски голоден. Проснувшись однажды утром после беспокойного сна, Грегор Замза обнаружил, что он у себя в постели превратился в страшное насекомое.

Лежа на панцирнотвердой спине, он видел, стоило ему приподнять голову, свой коричневый, выпуклый, разделенный дугообразными чешуйками живот, на верхушке которого еле держалось готовое вот-вот окончательно сползти одеяло. Его многочисленные, убого тонкие по сравнению с остальным телом ножки беспомощно копошились у него перед глазами. «Что со мной случилось? » – подумал он. Это не было сном. Его комната, настоящая, разве что слишком маленькая, но обычная комната, мирно покоилась в своих четырех хорошо знакомых стенах. Над столом, где были разложены распакованные образцы сукон – Замза был коммивояжером, – висел портрет, который он недавно вырезал из иллюстрированного журнала и вставил в красивую золоченую рамку.

На портрете была изображена дама в меховой шляпе и боа, она сидела очень прямо и протягивала зрителю тяжелую меховую муфту, в которой целиком исчезала ее рука. Затем взгляд Грегора устремился в окно, и пасмурная погода – слышно было, как по жести подоконника стучат капли дождя – привела его и вовсе в грустное настроение. «Хорошо бы еще немного поспать и забыть всю эту чепуху», – подумал он, но это было совершенно неосуществимо, он привык спать на правом боку, а в теперешнем своем состоянии он никак не мог принять этого положения. С какой бы силой ни поворачивался он на правый бок, он неизменно сваливался опять на спину. Закрыв глаза, чтобы не видеть своих барахтающихся ног, он проделал это добрую сотню раз и отказался от этих попыток только тогда, когда почувствовал какую-то неведомую дотоле, тупую и слабую боль в боку. «Ах ты, господи, – подумал он, – какую я выбрал хлопотную профессию! Изо дня в день в разъездах. Деловых волнений куда больше, чем на месте, в торговом доме, а кроме того, изволь терпеть тяготы дороги, думай о расписании поездов, мирись с плохим, нерегулярным питанием, завязывай со все новыми и новыми людьми недолгие, никогда не бывающие сердечными отношения. Черт бы побрал все это! » Он почувствовал вверху живота легкий зуд;
Loading

0 comments on commit b9679f8

Please sign in to comment.