PDA

Просмотр полной версии : [Вопрос] Как узнать из скольких символов состоит число?



123
30.09.2017, 14:14
Как проверить число на длинну? Строку можно проверить с помощью strlen(), а число только с сравнением крайних значений? Например нужно проверить на 6-ти значение число, получается, необходимо сравнить в пределах от 100000 до 999999? Или есть более рациональный подход?

DeimoS
30.09.2017, 16:19
Условие в этом случае будет самым быстродействующим, хоть и не самым компактным вариантом :) Хотя всегда можно сделать универсальную функцию

stock GetCountsOfDigits(number)
{
if(number < 100_000)
{
if(number < 100)
{
if(number < 10)
return 1;
else
return 2;
}
else
{
if(number < 1_000)
return 3;
else
{
if(number < 10_000)
return 4;
else
return 5;
}
}
}
else
{
if(number < 10_000_000)
{
if(number < 1_000_000)
return 6;
else
return 7;
}
else
{
if(number < 100_000_000)
return 8;
else
{
if(number < 1_000_000_000)
return 9;
else
return 10;
}
}
}
}
Код, если что, взят с хабра (вроде, брал отсюда (https://habrahabr.ru/post/269237/)) и переделан под реалии Pawn

Bib
30.09.2017, 17:39
Можно привести число к строке и получить ее длину



new string[10];
valstr(string, 123);
printf("Длина числа: %i", strlen(string));

$continue$
30.09.2017, 17:50
ln10 - будет адекватным вариантом (http://pro-pawn.ru/showthread.php?14625-GetNumberOfDigits)

Условие в этом случае будет самым быстродействующим, хоть и не самым компактным вариантом :) Хотя всегда можно сделать универсальную функцию

stock GetCountsOfDigits(number)
{
if(number < 100_000)
{
if(number < 100)
{
if(number < 10)
return 1;
else
return 2;
}
else
{
if(number < 1_000)
return 3;
else
{
if(number < 10_000)
return 4;
else
return 5;
}
}
}
else
{
if(number < 10_000_000)
{
if(number < 1_000_000)
return 6;
else
return 7;
}
else
{
if(number < 100_000_000)
return 8;
else
{
if(number < 1_000_000_000)
return 9;
else
return 10;
}
}
}
}
Код, если что, взят с хабра (вроде, брал отсюда (https://habrahabr.ru/post/269237/)) и переделан под реалии Pawn

DeimoS
30.09.2017, 18:01
ln10 - будет адекватным вариантом (http://pro-pawn.ru/showthread.php?14625-GetNumberOfDigits)

Будет медленнее, нежели условия. При том, в разы. Жертвовать скоростью ради компактности?
То же самое и с переводом числа в строку (ещё медленнее будет)

$continue$
30.09.2017, 21:47
2017 год. От пару мс ничего не будет

Будет медленнее, нежели условия. При том, в разы. Жертвовать скоростью ради компактности?
То же самое и с переводом числа в строку (ещё медленнее будет)

DeimoS
30.09.2017, 22:49
2017 год. От пару мс ничего не будет

Пару мс здесь, пару мс там и уже начинаются лаги.
Может лучше изначально делать всё на совесть, не? Или в 2017 году появились какие-то ограничения на количество строк?

123
01.10.2017, 03:10
Логарифм более универсальный вариант, нежели просто сравнение. Однако сравнение по скорости побеждает в 3 раза. Но сравнение с крайними значениями (то, о чем я писал в начале), самый быстрый вариант, хоть и самый узкий.


[01:54:08] Режим: интерпретируемый, 10000x1000 итераций.
[01:54:13] Сравнение: 1214
[01:54:13] Логарифм: 3355
[01:54:13] Условие: 925

DeimoS
01.10.2017, 13:25
Логарифм более универсальный вариант, нежели просто сравнение

Универсальный в чём? В том, что он может определить количество символов в числах >10 знаков? Так а в каких ситуациях такие числа вообще могут понадобиться? И где их хранить можно, если учесть, что у Integer есть своё ограничение? Сомнительная универсальность

А сравнение с крайними значениями быстрее, скорее всего, потому, что ты просто прописал одно единственное условие, да?
Ну типа:

if(1000000 <= number <= 9999999)
А в остальных случаях вызывал функции?
Ибо если собрать функцию из наборов крайних значений, получится явно медленнее обычного набора условий (а без Jit ещё и медленнее логарифма может быть), ибо в наборе условий произойдёт гораздо меньше проверок, например, для числа из 10 символов (всего около 4-х проверок будет), а в случае с крайними значениями - все 10 (можно, конечно, тоже добавить дополнительные условия, но всё равно сравнение с конкретным значением будет быстрее, нежели с крайними).

$continue$
01.10.2017, 13:35
Иногда лучше потратить пару лишних мс, чем писать огромный код для этих же целей. На паре по алгоритмизации использовали с одногруппником данный метод. И он универсален. Не нужно писать овер999 проверок для int. На счет расширение int - есть библиотека от VVWVV (http://pro-pawn.ru/member.php?4348-VVWVV) - unlong (https://github.com/TDW-org/samp-include-ulong). Если вдруг понадобится узнать длину, тоже будешь прописывать if/ы?

Выбор, конечно каждого, но я бы в данном случай использовал десятичный логарифм. Решение получается компактным, логичным. В случай с if'ами оно получается далеко не компактное.

P.S: в ней конечно есть функция ulong_getDigitCount (https://github.com/TDW-org/samp-include-ulong/blob/master/tdw_ulong.inc#L332-L341), но вопрос остается актуальным.

DeimoS
01.10.2017, 13:47
Иногда лучше потратить пару лишних мс, чем писать огромный код для этих же целей. На паре по алгоритмизации использовали с одногруппником данный метод. И он универсален. Не нужно писать овер999 проверок для int. ... Если вдруг понадобится узнать длину, тоже будешь прописывать if/ы?

Да, буду. Я лучше потрачу лишние 5 минут, но в перспективе сэкономлю кучу процессорного времени, нежели пожертвую этим временем ради утоления собственной лени. А тебе должны были объяснить на паре по алгоритмизации, что подобные суждения относятся лишь к коду, который не является универсальным для кучи разных ситуаций и который нужно прописывать десятки раз, а не единожды. Скорее всего тебе пытались объяснить, но ты не слушал, ибо писал код максимально быстро и компактно, а потому и отвлекаться на эту информацию не стал.



Выбор, конечно каждого, но я бы в данном случай использовал десятичный логарифм. Решение получается компактным, логичным. В случай с if'ами оно получается далеко не компактное.

Какое в данном случае вообще дело до компактности? Тебя что, игроки похвалят за то, что ты написал компактный код? Или препод? Что это за странная мания писать компактный код ради... ничего?


На счет расширение int - есть библиотека от VVWVV (http://pro-pawn.ru/member.php?4348-VVWVV) - unlong (https://github.com/TDW-org/samp-include-ulong).

Опять же, назови мне хоть 10-ок ситуаций, в которых может понадобиться данная библиотека и нельзя будет обойтись обычным Integer. Или ты всегда свой код пишешь с мыслью: "А вдруг я решу через пару лет использовать вон ту библиотеку, которая позволяет делать никому не нужную дичь?" (это я утрирую, если что. Я не называю unlong бесполезной библиотекой).
Может стоит решать проблемы по мере их поступления, не? Если уж приспичит использовать данную библиотеку и так лень будет добавить пару лишних условий в функцию, создай ещё одну, которая специально будет проверять большие числа. Или ты и мелкие сучки спиливаешь бензопилой, тратя кучу бензина, ибо лень поработать обычным топором или пилой? :fool:

$continue$
01.10.2017, 14:03
Про логарифма вообще не объясняли. Это свойство логарифма

А тебе должны были объяснить на паре по алгоритмизации, что подобные суждения относятся лишь к коду, который не является универсальным для кучи разных ситуаций и который нужно прописывать десятки раз, а не единожды. Скорее всего тебе пытались объяснить, но ты не слушал, ибо писал код максимально быстро и компактно, а потому и отвлекаться на эту информацию не стал.


Так давай с сравнением значении тоже писать через оператор "или" (я про > =<). Какая разница то? Что можно сделать компактней - делаешь в 50 строк кода. И отпираясь временем процессора, только вот сейчас 2017, а язык 90ых годов. Чувствуешь как за это время выросли технологии?

Если нет, то мне жаль тебя.

Какое в данном случае вообще дело до компактности? Тебя что, игроки похвалят за то, что ты написал компактный код? Или препод? Что это за странная мания писать компактный код ради... ничего?

Да. Руками работать с деревом в 2017 году.... Ты застрял походу, правда не знаю, где, но технологии развиваются. Для сучков можно использовать лобзик. Автоматизируй весь процесс.


Или ты и мелкие сучки спиливаешь бензопилой, тратя кучу бензина, ибо лень поработать обычным топором или пилой? :fool:

P.S: На этот спор я отвечать больше не буду. Все равно останешься прав ты (а если нет, то начнешь доказывать, что все равно ты прав не признавая поражение в споре). Как и сказал выше: дело каждого. Мне важна компактность в коде, а лучше всего среднее между компактность и скоростью работы кода.

DeimoS
01.10.2017, 14:36
Так давай с сравнением значении тоже писать через оператор "или" (я про > =<). Какая разница то? Что можно сделать компактней - делаешь в 50 строк кода. И отпираясь временем процессора, только вот сейчас 2017, а язык 90ых годов. Чувствуешь как за это время выросли технологии?

Если нет, то мне жаль тебя.

Какой рост технологий? Ты о чём? Речь идёт о SA-MP и о Pawn. И каждый подобный: "Да забью на скорость. Лучше меньше кода напишу", - в итоге суммируется и появляются задержки. И ты либо потом сидишь над оптимизацией кода, либо платишь в три раза больше за более топовое оборудование для сервера. И всё ради твоей бесполезной компактности, до которой не будет никому дела, кроме тебя (да и тебе уже через час никакого дела не будет до этой функции и того, как она написана).

И грош тебе цена, как программисту, если ты готов собственную лень пытаться компенсировать мощностью железа. Очень сочувствую тем работодателям, что однажды предложат тебе работу. Идти на подобные жертвы стоит лишь там, где это действительно оправдано (в случае с Pawn, например, нет смысла пихать везде emit ради долей миллисекунд, ибо это портит читаемость и усложняет поддержку кода). Ну, конечно, если ты не хочешь потом бороться с последствиями твоего "и так сойдёт".



Да. Руками работать с деревом в 2017 году.... Ты застрял походу, правда не знаю, где, но технологии развиваются. Для сучков можно использовать лобзик. Автоматизируй весь процесс.

В том-то и дело, что можно использовать лобзик. А ты предлагаешь использовать бензопилу, оправдывая это тем, что ей можно и деревья пилить -_-
Ты всё же остался на том же уровне, что был несколько лет назад, когда пришёл в Pawn: услышал где-то о компактности, не вник толком о чём идёт речь и теперь пытаешься пропихивать эту идею везде, где ни попадя. Как уже говорил ранее, сочувствую твоему будущему работодателю и тем, кто будет править твой код после тебя.

P.S. А эта тема с "всё равно ты не признаешь свой проигрыш" просто смешна. Если ты действительно прав, приведи хоть какие-то аргументы своей правоты, кроме компактности, которая только тебе приносит какие-то непонятные удовольствия, а машине остаётся лишь страдать. А пока я вижу, что только подобные тебе "прафессианалы" очень любят съезжать с темы со словами: "ты упёртый, тебя не переспорить". Почему-то у меня во всех случаях, когда я прав, удаётся убедить в этом даже самых упёртых и зазнавшихся людей. А у вас, неоцененных талантов, всё никак не получается :(
Если не готов приводить аргументы и отстаивать свою точку зрения - лучше промолчи, а не встревай сначала в спор, а потом сливайся.

$continue$
01.10.2017, 16:08
Где услышал? От кого? Что по док-вам?

-
Ты всё же остался на том же уровне, что был несколько лет назад, когда пришёл в Pawn: услышал где-то о компактности, не вник толком о чём идёт речь и теперь пытаешься пропихивать эту идею везде, где ни попадя

P.S: я даже больше отвечать не буду. хочешь на эту тему поговорить, пиши в лс. Сливаешь ты сам себя, а не я.

DeimoS
01.10.2017, 16:21
Где услышал? От кого? Что по док-вам?

Лол, ты сам сказал, что тебе там препод что-то рассказывал.

Ты лучше приведи аргументы в пользу своей компактности, а не в личку зазывай. Какой толк от того, что мы в личке всё продолжим? Кто потом смоет это прочесть и понять для себя что является правдой?

Disinterpreter
02.10.2017, 23:27
Пару мс здесь, пару мс там и уже начинаются лаги.
Может лучше изначально делать всё на совесть, не? Или в 2017 году появились какие-то ограничения на количество строк?

Если заказчик может купить пару ядер и пару планок ОЗУ, то можно не делать на совесть.

DeimoS
03.10.2017, 01:36
Если заказчик может купить пару ядер и пару планок ОЗУ, то можно не делать на совесть.

Ну так можно и штаны не снимать, если очень сильно хочется в туалет.
Речь ведь не о заказчике, а о моде для собственного сервера. Да и речь о конкретной ситуации, где лишь просто нужно скопировать готовый код и получить за счёт этого прирост к скорости относительно другой реализации. Никто никого не заставляет писать все условия по новой. К чему эти возгласы о компактности?

Понятно, что в определённых ситуациях иногда лучше сделать проще/быстрее (этого никто и не отрицает), но как вы данную ситуацию приписали к этим "определённым" - до сих пор непонятно.

Disinterpreter
04.10.2017, 12:53
Речь ведь не о заказчике, а о моде для собственного сервера. Да и речь о конкретной ситуации, где лишь просто нужно скопировать готовый код и получить за счёт этого прирост к скорости относительно другой реализации. Никто никого не заставляет писать все условия по новой. К чему эти возгласы о компактности?

Понятно, что в определённых ситуациях иногда лучше сделать проще/быстрее (этого никто и не отрицает), но как вы данную ситуацию приписали к этим "определённым" - до сих пор непонятно.

Свой мод я могу и на лиспе писать, тут вообще вопросов нет(кто как хочет так и городит).
Если я пишу на заказ, то меня пару МС вообще не волнует, если за это не доплатят.

P.S Вы думаете что крутые компании пишут отличный код и следят за оптимизацией? Вы посмотрите на Андроид МОЖНО БЫЛО придумать отличную архитектуру, а изобрели кусок говна... Вообще невменяемая ОС в плане архитектуры.

DeimoS
04.10.2017, 14:43
Свой мод я могу и на лиспе писать, тут вообще вопросов нет(кто как хочет так и городит).

Причём тут вообще это? Речь о том, что лучше изначально немного запариться и потом не страдать от проблем с лагами, доплачивая за лишние мощности оборудования или тратя время на оптимизацию, чем делать абы как со словами: "И так сойдёт".
Да, стрелять в собственную ногу или нет - каждый решает сам. Но даже если кто-то решится выстрелить, от этого данный поступок не станет логичным и правильным.


Если я пишу на заказ, то меня пару МС вообще не волнует, если за это не доплатят.

Ну тут уже сугубо дело каждого. Желаешь делать свою работу абы как - делай. Только потом не удивляйся, что и тебя обслуживают абы как где-нибудь в ЖКХ (им же за это тоже не доплачивают) :)


Вы думаете что крутые компании пишут отличный код и следят за оптимизацией? Вы посмотрите на Андроид МОЖНО БЫЛО придумать отличную архитектуру, а изобрели кусок говна... Вообще невменяемая ОС в плане архитектуры.

Никто и не говорит, что они все поголовно пишут хороший или плохой код. Но это не повод ровняться на них. У каждого есть своя голова на плечах.
Да и делают там "куски говна" как раз потому, что там сидят такие же, как "$continue$", и пишут код со словами: "И так сойдёт. Мне же за это не доплачивают", а не потому что так желают сами компании.
Хотя речь изначально вообще не об этом была. Мы говорим о написании кода для себя любимого, а не для кого-то. И про то, что в данном случае лучше скопировать код функции с кучей условий, который работает быстрее, нежели код, работающий через логарифм.

$continue$
04.10.2017, 16:16
Ты никак не поймешь суть...

1) Всегда имеет место быть другие варианты другой реализации.
2) Покажи, где я отрицал, что условия работают медленнее? Оно и понятно из чего (https://habrahabr.ru/post/112953/).
3) Я очень сомневаюсь, что ты увидишь разницу работы условии и логарифма (О да, щас начнет втирать про PVM). Я молчу про оптимизацию компиляторов C/C++ (Работать же Pawn программистам ты не будешь, правильно? А то покажи мне компанию, где требуются Pawn - программисты? Все пытаешься втирать про офис)
4) Ты устроил холивар на пустом месте. Я нигде не отрицал, что условия медленнее, но в обратную сторону ты получаешь компактный код (опять щас про PVM начнет втирать). Тут, наверное можно отделаться одной фразой: "Каждый дурак может написать код, понятный компьютеру. Хорошие программисты пишут код, понятный людям.". А то ты мне про компактность втирал, что PVM, грубо говоря насрать на компактный код, а раз уж ты хочешь получить прирост, то почему ты не сделал сравнения через ASM? (#emit). #быстрей_же. Очень странная логика.


Никто и не говорит, что они все поголовно пишут хороший или плохой код. Но это не повод ровняться на них. У каждого есть своя голова на плечах.
Да и делают там "куски говна" как раз потому, что там сидят такие же, как "$continue$", и пишут код со словами: "И так сойдёт. Мне же за это не доплачивают", а не потому что так желают сами компании.
Хотя речь изначально вообще не об этом была. Мы говорим о написании кода для себя любимого, а не для кого-то. И про то, что в данном случае лучше скопировать код функции с кучей условий, который работает быстрее, нежели код, работающий через логарифм.

Disinterpreter
04.10.2017, 16:21
Ну тут уже сугубо дело каждого. Желаешь делать свою работу абы как - делай. Только потом не удивляйся, что и тебя обслуживают абы как где-нибудь в ЖКХ (им же за это тоже не доплачивают) :)


Я жкх не засовываю во временные рамки. А код за деньги всегда приходится писать как можно быстрее.

Если человек пишет для себя, то он может разводить какой угодно говнокод впринципе.

Естественно людям которые везде говнокодят прошивки для спутников писать не дадут, но сайты/коддлясампа клепать нормально. Если человеку это нравится, и выше сайтов он не прыгает то всё ок.

DeimoS
04.10.2017, 16:29
Я жкх не засовываю во временные рамки. А код за деньги всегда приходится писать как можно быстрее.

ЖКХ засовывает во временные рамки начальство. А ты всегда можешь сказать своему работодателю, что если тебе дать немного больше времени, то ты можешь всё продумать гораздо лучше, объяснив, что в перспективе он сэкономит за счёт этого. Было бы желание.
В любом случае, это уже оффтоп и не будем об этом.

Disinterpreter
04.10.2017, 16:34
ЖКХ засовывает во временные рамки начальство. А ты всегда можешь сказать своему работодателю, что если тебе дать немного больше времени, то ты можешь всё продумать гораздо лучше, объяснив, что в перспективе он сэкономит за счёт этого. Было бы желание.
В любом случае, это уже оффтоп и не будем об этом.

Пишешь хорошо одну программу, вторую, а потом понимаешь что макросекунды никто не ценит, зачем оно?

Естественно у меня на работе есть проекты которые требуют качественного вылиза, но т.к требуют. А вот когда просят написать парсер почты в какой нибудь мессинжер, мне не впадел написать пару медленных регексов чем сплитовать целую страницу текста.

Думаешь на сервере $continue$ будет играть больше 50 человек? Сомневаюсь.

DeimoS
04.10.2017, 16:58
Пишешь хорошо одну программу, вторую, а потом понимаешь что макросекунды никто не ценит, зачем оно?

Ну так одно дело когда ты это делаешь для проекта, где это не нужно, а совсем другое - для себя. Да и гонка за микросекундами не должна давать видимых результатов. Точнее, результатом будет отсутствие проблем с использованием кода в дальнейшем, а не какое-то видимое ускорение при работе.



Думаешь на сервере $continue$ будет играть больше 50 человек? Сомневаюсь.

Та какая разница сколько и на чьём сервере будет играть человек? Это ведь твой проект и тебе потом работать с кодом: почему бы не вникнуть и не сделать всё качественно? Особенно в случае с кодом, написание которого займёт, от силы, пару минут. Эта пара минут впоследствии может избавить от пары десятка проблем и пары бессонных ночей, которые могут уйти на исправление "и так сойдёт"-кода.



Ты никак не поймешь суть...

1) Всегда имеет место быть другие варианты другой реализации.
2) Покажи, где я отрицал, что условия работают медленнее? Оно и понятно из чего (https://habrahabr.ru/post/112953/).
3) Я очень сомневаюсь, что ты увидишь разницу работы условии и логарифма (О да, щас начнет втирать про PVM). Я молчу про оптимизацию компиляторов C/C++ (Работать же Pawn программистам ты не будешь, правильно? А то покажи мне компанию, где требуются Pawn - программисты? Все пытаешься втирать про офис)
4) Ты устроил холивар на пустом месте. Я нигде не отрицал, что условия медленнее, но в обратную сторону ты получаешь компактный код (опять щас про PVM начнет втирать). Тут, наверное можно отделаться одной фразой: "Каждый дурак может написать код, понятный компьютеру. Хорошие программисты пишут код, понятный людям.". А то ты мне про компактность втирал, что PVM, грубо говоря насрать на компактный код, а раз уж ты хочешь получить прирост, то почему ты не сделал сравнения через ASM? (#emit). #быстрей_же. Очень странная логика.

И да, холивар устроил ты, начав твердить о том, что никак не мог подкрепить фактами ;) Я лишь пытаюсь объяснить тем, кто наткнётся на твои сообщения, что твои идеи никак не работают в случае, описанном автором вопроса.
Собственно, и про emit я уже отвечал выше, что показывает как сильно ты вникаешь в этот диалог

Я вообще не понимаю почему у вас ещё и желание спорить возникает в этом случае. Это же не какая-то лютая оптимизация с использованием байт-кода или взломом ноосферы. Это просто выбор более быстрой реализации из двух имеющихся. Реализаций, которые не отличаются какими-то существенными извращениями и никак не вредят читаемости кода. Реализаций, которые уже придуманы и написаны за вас. Как в данном случае можно выбирать более медленный вариант - я не могу понять до сих пор.

Disinterpreter
04.10.2017, 17:14
Я вообще не понимаю почему у вас ещё и желание спорить возникает в этом случае. Это же не какая-то лютая оптимизация с использованием байт-кода или взломом ноосферы.

У меня просто личная неприязнь к байтодебилизму.

"Преждевременная оптимизация — корень всех зол." Д.Кнут

Люблю садиться за код где больше описано нормальными операторами чем высчитыванием байтов и прочими костылями.

DeimoS
04.10.2017, 17:37
У меня просто личная неприязнь к байтодебилизму.


Люблю садиться за код где больше описано нормальными операторами чем высчитыванием байтов и прочими костылями.

Так а где идёт речь о том, что нужно байтодебелизмом заниматься? Я сам ярый противник такого извращения во всех случаях, где это совсем не нужно. Но в данном случае никакого байтодебелизма нет ведь. Как раз наоборот, если учесть, что многие скриптеры в SA-MP ещё не начали проходить в школе логарифмы :D

Суть всего этого диалога в том, что некий $continue$ начал утверждать, мол лучше выбрать более медленный вариант реализации из двух предоставленных, ибо он компактнее. Я изначально утверждал, что заниматься извращениями, а-ля emit, где ни попадя - бред сивой кобылы. Я не призывал заниматься какими-либо извращениями с оптимизацией, переписывая всё, что только можно, в условия. Речь шла о конкретной ситуации с конкретным кодом. И в этой ситуации, как мне кажется, вариант с условиями очевиден для выбора, ибо это не тот код, который тебе придётся постоянно дорабатывать или хотя бы просто заглядывать в него. Так что не совсем понятно почему находятся защитники "компактного" варианта.

$continue$
04.10.2017, 17:39
Давай, расскажи какие проблемы могут быть с логарифмом?

Кроме как проверки на отрицательное число.

Особенно в случае с кодом, написание которого займёт, от силы, пару минут. Эта пара минут впоследствии может избавить от пары десятка проблем и пары бессонных ночей, которые могут уйти на исправление "и так сойдёт"-кода.

Так это проблема коммьюнити. Меня не сильно интересует это. Не знание, не освобождает о ответственности.

Как раз наоборот, если учесть, что многие скриптеры в SA-MP ещё не начали проходить в школе логарифмы :D

DeimoS
04.10.2017, 18:15
Давай, расскажи какие проблемы могут быть с логарифмом?

Причём тут проблема с логарифмами, кода речь идёт о процессорном времени?
Или ты не знаешь, что SA-MP работает в одном потоке? Каждая задержка на миллисекунду в этом потоке приводит к тому, что весь последующий код обрабатывается на миллисекунду позже. И с каждым тактом обработки кода эта задержка растёт в арифметической прогрессии. И каждый такой код наращивает эту самую задержку. А потом начинается отставание таймеров и всё остальное. И летят костыли за костылями в надежде исправить результаты лени из прошлого. А всего-то стоит сделать немного другой выбор, дабы этого избежать.


Так это проблема коммьюнити. Меня не сильно интересует это. Не знание, не освобождает о ответственности.

Так а твоя лень - это сугубо твоя проблема. Почему сервер и игроки должены от неё страдать?

Твоя проблема в том, что ты теоретик. При том, довольно слабый теоретик.

$continue$
04.10.2017, 18:28
Так это документированный баг и фиксится он билдом плагина (https://github.com/Thomas14/samp-plugin-timerfix) (кстати, оно советуется и fixes.inc (https://github.com/Open-GTO/sa-mp-fixes/blob/master/fixes.inc)).

https://i.imgur.com/mHz29X0.png


А потом начинается отставание таймеров и всё остальное.

Не. Так давай переводить из C/C++ в ASM, тебе же не лень. Именно для этого и был придуман компилятор и другие языки программирования, чтобы избавить программиста от написание огромных строк кода. Ну ты все равно выбираешь метод - написать больше и получить в миллисекундах прирост производительности. Почему мало людей сейчас пишут на чистом ASM? Одна из причин не выгодно и затратно. На чистом ASM пишут какие нибудь загрузчики OS и ему подобное ПО, которое требует максимальной скорости. С Pawn такая же ситуация. Я знаю, что Pawn работает в single thread, но меня не останавливает использовать логарифм в своих проектах. Не знаю, почему тебя это пугает. Наверное ты и массивов избегаешь (оно удобней, но медленнее). Как часто бывает, что красивей выглядит - то помедленнее работает. И вообще такой вопрос (хотя ты уже давал на него ответ): часто ли ты используешь функцию для вычисления размера?

Вообще не критичная ситуация.

Так а твоя лень - это сугубо твоя проблема. Почему сервер и игроки должены от неё страдать
Я не был и не буду профессионалом в области Pawn/SA-MP. Я такое нигде не писал, а ты выдумал, что я какой то профик. Я не читал книги по Pawn Lang, как делал это ты (это может и ошибка, но это не останавливает меня писать код на этом языке). Хреновый теоретик? Я изначально вроде сказал, что оно будет медленнее условии, но выглядеть оно будет проще (зная свойство логарифма) и универсальнее. Если int будет > чем 2 ^ 32 - ещё пару условий (но в Pawn 2^31). Просто в данном случай меньше условий, но вообще это садомазахизм (http://lurkmore.to/BDSM)

Твоя проблема в том, что ты теоретик. При том, довольно слабый теоретик.

DeimoS
04.10.2017, 18:33
Так это документированный баг и фиксится он билдом плагина
Это не баг, а особенность однопоточности. Такая особенность есть и, например, в JavaScript (https://habrahabr.ru/post/31603/). И отставания как раз случаются из-за другого кода, а не из-за самих таймеров. И чем меньше будет задержка из-за другого кода, тем меньше будет искажение у таймеров.


Не. Так давай переводить из C/C++ в ASM, тебе же не лень. *море ненужного текста*

А теперь бегом перечитывать все мои предыдущие сообщения, в которых я объяснял почему в данном случае эти миллисекунды важны.

$continue$
04.10.2017, 18:40
Так в данном случай мы тоже получим прирост производительности. Почему бы и нет?

А теперь бегом перечитывать все мои предыдущие сообщения, в которых я объяснял почему в данном случае эти миллисекунды важны.

DeimoS
04.10.2017, 18:58
Так в данном случай мы тоже получим прирост производительности. Почему бы и нет?

1) Код уже написан за тебя и тебе нужно лишь скопировать
2) Такая реализация не усложняет читаемость кода, но, при этом, повышает скорость.

С такой же логикой можно вообще забить на оптимизацию и писать как попало. А что, 2017 же!

UPD: перенёс вопрос в отдельную тему

Daniel_Cortez
05.10.2017, 16:07
>_>

<_<

Я просто оставлю это здесь:



stock GetNumberOfDigits(number)
{
if (number < 100_000)
{
if (number < 100)
return 1 + _:(number >= 10);
if (number < 10_000)
return 3 + _:(number >= 1_000);
return 5;
}
if (number < 10_000_000)
return 6 + _:(number >= 1_000_000);
if (number < 1_000_000_000)
return 8 + _:(number >= 100_000_000);
return 10;
}


http://pro-pawn.ru/showthread.php?12585


/*======== Настройки =========================================================*/
#include <float>

const PROFILER_ITERATIONS_MAJOR = 100_000;
const PROFILER_ITERATIONS_MINOR = 10;

new const code_snippets_names[3][] =
{
{"VVWVV"},
{"DeimoS"},
{"Daniel_Cortez"}
};

stock
GetNumberOfDigits_VVWVV({Float,_}:number)
{
return number != 0 ? floatround(floatlog(floatabs(number))) + 1 : 1;
}

stock GetCountsOfDigits_DeimoS(number)
{
if(number < 100_000)
{
if(number < 100)
{
if(number < 10)
return 1;
else
return 2;
}
else
{
if(number < 1_000)
return 3;
else
{
if(number < 10_000)
return 4;
else
return 5;
}
}
}
else
{
if(number < 10_000_000)
{
if(number < 1_000_000)
return 6;
else
return 7;
}
else
{
if(number < 100_000_000)
return 8;
else
{
if(number < 1_000_000_000)
return 9;
else
return 10;
}
}
}
}

stock GetNumberOfDigits_DC(number)
{
if (number < 100_000)
{
if (number < 100)
return 1 + _:(number >= 10);
if (number < 10_000)
return 3 + _:(number >= 1_000);
return 5;
}
if (number < 10_000_000)
return 6 + _:(number >= 1_000_000);
if (number < 1_000_000_000)
return 8 + _:(number >= 100_000_000);
return 10;
}

// 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, ..., 90, 100, 200, ..., 2_000_000_000
static numbers[9 * 9 + 3];

#define Prerequisites();\
numbers[0] = 0; \
for (new i = 0, inc = 1, n = 1; i < 9; ++i, inc *= 10) \
for (new j = 1; j < 10; ++j, n += inc) \
numbers[i * 9 + j] = n; \
numbers[82] = 1_000_000_000; \
numbers[83] = 2_000_000_000; \
static i;

#define CodeSnippet0();\
for (i = 0; i < sizeof(numbers); ++i) \
GetNumberOfDigits_VVWVV(numbers[i]);

#define CodeSnippet1();\
for (i = 0; i < sizeof(numbers); ++i) \
GetCountsOfDigits_DeimoS(numbers[i]);

#define CodeSnippet2();\
for (i = 0; i < sizeof(numbers); ++i) \
GetNumberOfDigits_DC(numbers[i]);
/*======== Конец настроек ===================================================*/




Тестирование: 3 отрывка кода.
Режим: интерпретируемый, 100000x10 итераций.
VVWVV: 26177
DeimoS: 7585
Daniel_Cortez: 6924



Тестирование: 3 отрывка кода.
Режим: с JIT-компиляцией, 100000x10 итераций.
VVWVV: 9168
DeimoS: 1093
Daniel_Cortez: 1085




Ты шо, это ведь слишком сложно в написании и не компактно! Гораздо важнее сэкономить количество строк

VVWVV
05.10.2017, 17:11
>_>

<_<

Я просто оставлю это здесь:



stock GetNumberOfDigits(number)
{
if (number < 100_000)
{
if (number < 100)
return 1 + _:(number >= 10);
if (number < 10_000)
return 3 + _:(number >= 1_000);
return 5;
}
if (number < 10_000_000)
return 6 + _:(number >= 1_000_000);
if (number < 1_000_000_000)
return 8 + _:(number >= 100_000_000);
return 10;
}



Я, пожалуй, перенесу данную функцию в тему с GetNumberOfDigits (с указанием авторства), если ты не против..

Daniel_Cortez
06.10.2017, 18:05
Я, пожалуй, перенесу данную функцию в тему с GetNumberOfDigits (с указанием авторства), если ты не против..
Не против, только лучше обнови его ещё раз. В моём коде, равно как и в коде DeimoS'а, не учитывались отрицательные числа.
Исправленная версия:


stock GetNumberOfDigits(number)
{ // by Daniel_Cortez \\ pro-pawn.ru
if (number < 0)
number = -number;
if (number < 100_000)
{
if (number < 100)
return 1 + _:(number >= 10);
if (number < 10_000)
return 3 + _:(number >= 1_000);
return 5;
}
if (number < 10_000_000)
return 6 + _:(number >= 1_000_000);
if (number < 1_000_000_000)
return 8 + _:(number >= 100_000_000);
return 10;
}


Тест производительности (в вариант DeimoS'а я тоже добавил проверку на отрицательные числа):


#include <float>

const PROFILER_ITERATIONS_MAJOR = 100_000;
const PROFILER_ITERATIONS_MINOR = 10;

new const code_snippets_names[3][] =
{
{"VVWVV"},
{"DeimoS"},
{"Daniel_Cortez"}
};

stock
GetNumberOfDigits_VVWVV({Float,_}:number)
{
return number != 0 ? floatround(floatlog(floatabs(number))) + 1 : 1;
}

stock GetCountsOfDigits_DeimoS(number)
{
if (number < 0)
number = -number;
if (number < 100_000)
{
if(number < 100)
{
if(number < 10)
return 1;
else
return 2;
}
else
{
if(number < 1_000)
return 3;
else
{
if(number < 10_000)
return 4;
else
return 5;
}
}
}
else
{
if(number < 10_000_000)
{
if(number < 1_000_000)
return 6;
else
return 7;
}
else
{
if(number < 100_000_000)
return 8;
else
{
if(number < 1_000_000_000)
return 9;
else
return 10;
}
}
}
}

stock GetNumberOfDigits_DC(number)
{
if (number < 0)
number = -number;
if (number < 100_000)
{
if (number < 100)
return 1 + _:(number >= 10);
if (number < 10_000)
return 3 + _:(number >= 1_000);
return 5;
}
if (number < 10_000_000)
return 6 + _:(number >= 1_000_000);
if (number < 1_000_000_000)
return 8 + _:(number >= 100_000_000);
return 10;
}

// 0, -1, 2, -3, 4, -5, 6, -7, 8, -9, 10, -20, ..., 90, -100, 200, ..., -2_000_000_000
static numbers[9 * 9 + 3];

#define Prerequisites(); \
numbers[0] = 0; \
for (new i = 0, inc = 1, n = 1; i < 9; ++i, inc *= 10) \
for (new j = 1; j < 10; ++j, n += inc) \
numbers[i * 9 + j] = n * (((i * 9 + j) & 1) * -2 + 1); \
numbers[82] = 1_000_000_000; \
numbers[83] = -2_000_000_000; \
static i;

#define CodeSnippet0(); \
for (i = 0; i < sizeof(numbers); ++i) \
GetNumberOfDigits_VVWVV(numbers[i]);

#define CodeSnippet1(); \
for (i = 0; i < sizeof(numbers); ++i) \
GetCountsOfDigits_DeimoS(numbers[i]);

#define CodeSnippet2(); \
for (i = 0; i < sizeof(numbers); ++i) \
GetNumberOfDigits_DC(numbers[i]);



Режим: интерпретируемый, 100000x10 итераций.
VVWVV: 26277
DeimoS: 10300
Daniel_Cortez: 9775




Режим: с JIT-компиляцией, 100000x10 итераций.
VVWVV: 9056
DeimoS: 1170
Daniel_Cortez: 1165

NewGreen
07.10.2017, 18:40
Что скажете насчет такого варианта:


stock GetCountsOfDigits(number)
{
new counts = 0;
if(number < 0)
number = -number;
while(number != 0) {
counts++;
number /= 10;
}
return counts;
}

$continue$
07.10.2017, 18:44
Там была вверху ссылка на хабру. Вырезка из текста: "скорость которого линейно зависит от длины числа."

Что скажете насчет такого варианта:


stock GetCountsOfDigits(number)
{
new counts = 0;
if(number < 0)
number = -number;
while(number != 0) {
counts++;
number /= 10;
}
return counts;
}

NewGreen
07.10.2017, 18:54
Там была вверху ссылка на хабру. Вырезка из текста: "скорость которого линейно зависит от длины числа."
Если не ошибаюсь то в pawn, ячейка равна 4 байта, следовательно максимальная длина проверяемого числа равна 10-ти - это немного.
Поэтому вряд ли этот вариант будет сильно уступать описанным выше.

DeimoS
07.10.2017, 19:11
Если не ошибаюсь то в pawn, ячейка равна 4 байта, следовательно максимальная длина проверяемого числа равна 10-ти - это немного.
Поэтому вряд ли этот вариант будет сильно уступать описанным выше.

А если всё же не гадать, а просто провести тесты?
Тем более, что выше уже практически готовый код есть.

Да и, опять же, с каких пор экономия строк стала выгоднее процессорного времени?

NewGreen
07.10.2017, 19:50
А если всё же не гадать, а просто провести тесты?
Тем более, что выше уже практически готовый код есть.
Да и, опять же, с каких пор экономия строк стала выгоднее процессорного времени?

Итераций 100000x100 (без jit) :
time_Deimos = -6975
time_DC = -6408
time_NewGreen = -18560

Итераций 100000x100 (с jit) :
time_Deimos = -457
time_DC = -522
time_NewGreen = -4460

В общем остальные вопросы "почему" отпадают)