?

Log in

No account? Create an account
Previous Entry Share Next Entry
2016-01

640k is enough for everyone

сделал я значит логгер, с сообщениями пронумерованными как int32

и решил показать в дашборде последнее сообщение лога.
запустил, долго думал "где же баг" - вместо номера сообщения какой-то случайный мусор :)

потом осознал, что бага нет, а логгер в тесте

while(true) { log("HELLO") }

выдаёт сколько-то там миллионов RPS и лепить в счетчик int32 было как-то, хмм, опрометчиво, потому что переполняется он мгновенно :) хороший логгер получился, короче.

This entry was originally posted at http://wizzard.dreamwidth.org/472745.html. It has comment count unavailable comments. Please comment there using OpenID.

  • 1
mbr May 16th, 2016
вот поэтому стоит использовать uint32_t везде, где не требуются отрицательные числа явно.

salas May 16th, 2016
Разве это не маскирует баг?

blackyblack May 16th, 2016
Правильней использовать bigint везде, где не требуется максимальная производительность. uint32 так себе панацея. Может автору требовалась уникальность счётчика.

Google C++ Style Guide, On Unsigned Integers

bik_top May 16th, 2016
> вот поэтому стоит использовать uint32_t везде, где не требуются отрицательные числа явно.

«So, document that a variable is non-negative using assertions. Don't use an unsigned type.»

wizzard0 May 16th, 2016
э, а чем мне uint32 поможет от переполнения? о_О

109 May 16th, 2016
кстати, да. какого хрена массивы нумеруются интом, а не юинтом?

wizzard0 May 16th, 2016
да что тут все за знаковость вцепились? чем беззнаковость помогает от оверфлоу?

ex_juan_gan May 16th, 2016
Сказывается сишный опыт.
Я б просто поставил, скажем, 36-base числа, в виде строк, их бесконечное количество.
Ну в смысле я уже такое поставил в одном месте.

wizzard0 May 16th, 2016
мнэээ, у меня hard realtime, там нельзя arbitrary precision по определению

vaddimka May 17th, 2016
Делал недавно что-то такое с циклическим буфером на мегабайт и произвольной длиной сообщения, кстати надо посмотреть, вставил ли я туда счетчик. Туда же всунул опциональную регистрацию всех сообщений из данного c файла под определенным именем модуля и логлевел. Вообще интересно иногда на чистых сях писать, столько всего руками поделать можно.

mbr May 17th, 2016
Каноническая реализация кольцевых буферов подразумевает размеры 2^n и маску 2^n - 1, что превращает переполнение из головной боли в фичу.

amarao_san May 17th, 2016
Очередной дефицит натуральных чисел. Хотя казалось бы, выдали человечеству бесоконечность - но её постоянно не хватает.

wizzard0 May 17th, 2016
ну, э. мне надо за конечное время пакет обработать...

maxim May 17th, 2016
У нас везде Bigint в бизнес-объектах, слава буддам вкатили GMP в Erlang на его заре.

wizzard0 May 17th, 2016
так там и не реалтайм)

  • 1