|
|
|
LOCAL |
|
|
Sirocco |
12.3.2019, 23:12
|
Expert
Сообщений: 810
Регистрация: 2.2.2012 Группа: Пользователи Наличность: 15490
Пользователь №: 14.566
Возраст: 30
|
вот вам функция деления числа на разряды f_math_cathegory 12345678 возвращает результат 12.345.678 немножко про этот долбанутый алгоритм. я ж не могу сразу проверить открыт local.cat или нет, он же всегда возвращает 0, а у меня внутри может и 0 хранится. поэтому я ввожу еще один дополнительный параметр local.h, чтобы просто приравнять его к 1. еще мне к local.cat в конце приходится приписывать букву Z, чтобы сумасшедшяя сфера поняла что у меня string. в конце я избавлюсь от этой буквы с помощью STRSUB. Пользуйтесь... Код [FUNCTION f_math_cathegory] //делит число на разряды if strlen(<argn>) <= 3 return <eval <argn>> endif local.cat_argn = <argn> if (<local.cat_argn> < 0) local.cat_m = 1 local.cat_argn = "<eval(<local.cat_argn> * -1)>" endif local.cat_lng = <eval strlen(<dlocal.cat_argn>)> FOR m <local.cat_lng> local.cat_i = "<eval <local.cat_lng> - <local.m>>" local.cat_j = "<eval(0<local.cat_j> + 1)>" local.cat_chart = "<STRSUB <local.cat_i> 1 <eval(<dlocal.cat_argn>)>>" if !(0<local.h>) local.h = 1 local.cat = "<dlocal.cat_chart>z" elseif (<local.cat_j> == <eval((<local.cat_j> / 3) * 3)>) && (<local.cat_i> != 0) local.cat = ".<dlocal.cat_chart><local.cat>" else local.cat = "<dlocal.cat_chart><local.cat>" endif ENDFOR local.cat_lng = <eval strlen(<local.cat>)> local.cat = "<STRSUB 0 <eval <local.cat_lng> - 1> <local.cat>>" if 0<local.cat_m> local.cat = "-<local.cat>" endif return <local.cat>
|
|
|
|
Aimed |
13.3.2019, 1:26
|
Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012 Группа: Пользователи Наличность: 8678
Пользователь №: 15.607
|
А вобще советую почитать мануал. В Сфере есть функции для каста типов данных. Цитата(Sirocco @ 12.3.2019, 20:59) local.a = // число 0
И? А что тут по твоему должно быть? Учи матчасть. Если это инт, то не инициализированный инт всегда будет равен 0. Если это строка, то пустая, инициализированная, строка в С будет иметь знак-терминации '\0', который в ASCII равен 0. А если её не инициализировать, то сфера вылетит с нулл поинтером. Цитата(Sirocco @ 12.3.2019, 20:59) local.a = 2/2 // число 1 - однако!
Не "однако!", - a все правильно, у тебя там оператор деления используется. Ты вобще хоть какой-нибудь код хоть раз в жизни писал? Всегда сперва операция, потом присвоение. Хочешь строку? Используй квоты. Цитата(Sirocco @ 12.3.2019, 20:59) local.a = 1z // строка local.a = 1.1 // строка
1z строка, да, а что ещё тут может быть? 1.1 тоже строка, потому что сфера если сфера будет пытаться конвертировать твой скрипт во все типы данных, пока не найдет нужный, там производительности вобще не останется. Используй float, хотя он как-то очень уж криво работает.
|
|
|
|
Ozzy Osbourne |
13.3.2019, 11:58
|
Grandmaster
Сообщений: 2.067
Регистрация: 5.8.2003 Группа: Пользователи Наличность: 0
Пользователь №: 810
Возраст: 32
|
Нет под рукой сферы что бы проверить, но думаю идея понятна Было бы интересно взять эти две функции да засунуть в цикл из тысячи итераций и посмотреть на скорость Код [FUNCTION f_math_2cathegory] IF (<DB.Connected>==1) DB.Query "SELECT REPLACE(REPLACE(REPLACE(FORMAT('<eval <argn>>', 2), '.', '@'), ',', '.'), '@', ',') as x" IF (<DB.ROW.NumRows>>0) return <DB.ROW.0.x> ENDIF ENDIF return <eval <argn>> === Моё любопытство взяло верх, провел тесты Код FOR i 0 100000 mysql = 12905ms Sirocco = 13068ms
FOR i 0 10000 mysql = 1495ms Sirocco = 1320ms Что говорит нам о том что лучше твой код сократить и использовать возможности mysql (IMG: style_emoticons/default/smile.gif) Ибо на долгой дистанции она дает бонус в скорости, а на короткой - разница совершенно не заметна, зато нет кода со сложной логикой + есть валидация и возможности sql
--------------------
|
|
|
|
Aimed |
13.3.2019, 14:23
|
Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012 Группа: Пользователи Наличность: 8678
Пользователь №: 15.607
|
Цитата(Ozzy Osbourne @ 13.3.2019, 9:58) Нет под рукой сферы что бы проверить, но думаю идея понятна Было бы интересно взять эти две функции да засунуть в цикл из тысячи итераций и посмотреть на скорость Код [FUNCTION f_math_2cathegory] IF (<DB.Connected>==1) DB.Query "SELECT REPLACE(REPLACE(REPLACE(FORMAT('<eval <argn>>', 2), '.', '@'), ',', '.'), '@', ',') as x" IF (<DB.ROW.NumRows>>0) return <DB.ROW.0.x> ENDIF ENDIF return <eval <argn>> === Моё любопытство взяло верх, провел тесты Код FOR i 0 100000 12:12:(a.scp,30)[mysql] 12:12:(a.scp,33) 12905ms
12:12:(a.scp,49)[Sirocco] 12:12:(a.scp,52)13068ms
FOR i 0 10000 2:13:(a.scp,30)[mysql] 12:13:(a.scp,33)TOTAL = 1495ms
12:13:(a.scp,49)[Sirocco] 12:13:(a.scp,52)TOTAL = 1320ms Что говорит нам о том что лучше твой код сократить и использовать возможности mysql (IMG: style_emoticons/default/smile.gif) Ибо на долгой дистанции она дает бонус в скорости, а на короткой - разница совершенно не заметна, зато нет кода со сложной логикой + есть валидация и возможности sql А тут уже зависит от того что ему нужно с этим скриптом делать. Если там одиночный запрос что-бы сделать красивую стрингу и показать её по клику на кучку гп, то тут нет смысла по 10к итераций крутить и тем более 100к.
|
|
|
|
Aimed |
13.3.2019, 16:29
|
Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012 Группа: Пользователи Наличность: 8678
Пользователь №: 15.607
|
Цитата(Ozzy Osbourne @ 13.3.2019, 12:26) Ну смысла нет, это был чисто эксперемент не слишком ли медленно мускул отвечает в данном случае и выполняет эти преобразования по сравнению со сферовской работой по строке. Как оказалось - достаточно шустро...
Это спорно, если тут речь о кликах по кучкам гп. Там разница будет ощутимой. А ещё он нюбский алгоритм написал в котором внутри главного цикла мега медленные сферовские if проверки стоят. Цитата(Ozzy Osbourne @ 13.3.2019, 12:26) Плюс он спрашивал как сократить его код в "раза три" (IMG: style_emoticons/default/smile.gif) Вот раза в 3 короче и заодно шустрее. Чем больше число, тем шустрее он будет работать в сравнении с его алгоритмом: Код [FUNCTION f_math_2cathegory] local.lng = <eval strlen(<args>)> while <local.lng> > 3 local.lng -= 3 local.res = ".<strsub <local.lng> 3 <args>><local.res>" //отрезаем по 3 и клеим спереди endwhile local.leftover = "<strsub 0 <local.lng> <args>>"//то что осталось спереди, может включать в себя '-' if (!strcmp(-, <local.leftover>) && strlen(<local.leftover>) == 1) //если нашли только '-', отрезаем точку спереди и 0 в конце строки res local.res = "<local.leftover><strsub 1 <eval strlen(<local.res>)-2> <local.res>>" else //если спереди осталось больше 1 знака, отрезаем только 0 в конце строки res local.res = "<local.leftover><strsub 0 <eval strlen(<local.res>)-1> <local.res>>" endif return <local.res>
|
|
|
|
Aimed |
13.3.2019, 17:13
|
Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012 Группа: Пользователи Наличность: 8678
Пользователь №: 15.607
|
Цитата(Sirocco @ 13.3.2019, 15:05) local.res = ".<strsub <local.lng> 3 <args>><local.res>" а что делает эта строчка, когда local.res не объявлен... и следовательно равен 0?
А он и так всегда равен 0, даже если сделать local.res = или local.res = "" как только ты используешь local переменную сфера её сразу же обьявляет под капотом. Поэтому я этот 0 и отрезаю после цикла. И никакого адекватного способа нету в сферскрипте что б инициализировать пустую строку. Этот сферскрипт это дичь полнейшая. Я пока писал о<вырезано анти-матом>л от количества неопределенного поведения. Как вы вобще на нем пишите, я не понимаю. Это, наверное, мой последний кусок сферскрипта что я написал (IMG: style_emoticons/default/biggrin.gif) Цитата(Sirocco @ 13.3.2019, 15:05) .show f_math_2cathegory 1234 => return "12340"
что меня и бесит!
Скорее всего что у тебя старая, забагованная версия ) Cкопируй ещё раз, сейчас. О, ещё один баг нашел. Если число имеет 3 или меньше знаков.
|
|
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|