perf(canonical-json): быстрый путь для чисел, уже точно представимых на шкале (E1) - #8
Merged
Merged
Conversation
…на шкале (E1) `decimal.js` строит значение из `String(n)` — из кратчайшего представления, которое round-trip'ится обратно в то же число. Значит, когда это представление и так короче восьми знаков после запятой и записано без экспоненты, весь круг «строка → Decimal → toDecimalPlaces → toFixed → строка» возвращает РОВНО исходную строку: округлять нечего, переводить в фиксированную нотацию нечего. Такие числа — большинство артефакта: индексы баров, метки времени, размеры, цены с биржевым тиком. Условие намеренно консервативно: есть `e` — медленный путь (1e-7 обязано стать 0.0000001); дробная часть длиннее шкалы — медленный путь (есть что округлять по HALF_EVEN). `-0` отдельным случаем не нужен: `String(-0)` в JS и так `"0"`. Значений не двигает, и это проверено, а не заявлено: тест держит рядом дословную копию прежней реализации как эталон и сверяет обе ветки на кромках (границы шкалы, экспоненты с обеих сторон, MAX_SAFE_INTEGER, MIN_VALUE, EPSILON) и на 20 000 случайных величин двенадцати порядков. Гейты: pnpm typecheck → 0; pnpm test → 116 passed / 0 failed; gate:determinism и gate:tapes чистые. Парный замер сериализатора на 40 000 строк артефакта: 4463 → 1868 мс (×2.39).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Шаг E1 волны E (analysis/21–22; ~16 % профиля). Значений не двигает.
Идея
decimal.jsстроит значение изString(n)— из кратчайшего представления, которое round-trip'ится обратно в то же число. Значит, когда это представление и так короче восьми знаков после запятой и записано без экспоненты, весь круг «строка →Decimal→toDecimalPlaces→toFixed→ строка» возвращает ровно исходную строку: округлять нечего, переводить в фиксированную нотацию нечего. Такие числа — большинство артефакта: индексы баров, метки времени, размеры, цены с биржевым тиком.Условие быстрого пути намеренно консервативно:
e⇒ медленный путь (1e-7обязано стать0.0000001,1e21— развернуться);-0отдельным случаем не нужен:String(-0)в JS и так"0".Почему это не сдвиг значений, а не «должно быть не сдвигом»
Тест держит рядом дословную копию прежней реализации как эталон и сверяет обе ветки:
0.123456785,1.000000005), экспоненты с обеих сторон (1e-7…1e-9,1e20…1.5e22),MAX_SAFE_INTEGER,MIN_VALUE,EPSILON,-0;Гейты
pnpm typecheck→ 0pnpm test→ 116 passed / 0 failedpnpm gate:determinism→ clean;pnpm gate:tapes→ 3 tape(s) OKtaskset -c 2,3, минимум из 5, 40 000 строк артефакта): 4463 → 1868 мс, ×2.39. Окно было шумным (параллельно шёл тестовый прогон backtester'а), поэтому абсолюты завышены — отношение при таком разрыве устойчиво, но переснимается в тихом окне перед приёмкой волны.