purebasic.info

PureBasic forum
Текущее время: Пн дек 17, 2018 5:42 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 128 ]  На страницу 1, 2, 3, 4, 5 ... 9  След.
Автор Сообщение
 Заголовок сообщения: Как ускорить
СообщениеДобавлено: Вс сен 23, 2018 2:16 pm 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 712
Благодарил (а): 75 раз.
Поблагодарили: 21 раз.
Пункты репутации: 5
мне удалось ускорить, но всё равно долго, основной тормоз эти две строки каждая в своём цикле, целая куча функций работы со строками
основная прибавка, это удаление всех промежуточных переменных и вытягивание в одну строку, о сбирать не строку, а ложить сразу в память, всё остальное дало слишком мало чтобы упоминать
эти циклы короткие, их разворчивание в ленту даёт мизирную прибавку, так что основной тормоз, это встроенные строковые функции
тут я упёрся и незнаю что ещё можно сделать
Код:
1
2
3
s+RSet(Bin(FindString(p, Mid(a(k), u, 1))-1), 6, "0")
 
PokeA(*db2, Val("$"+RSet(Hex(Val("%"+Mid(s, u, 8)), #PB_Byte), 2, "0")))



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как ускорить
СообщениеДобавлено: Вс сен 23, 2018 7:22 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 677
Благодарил (а): 2 раз.
Поблагодарили: 34 раз.
Пункты репутации: 9
Нужно на фасме делать. :D


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как ускорить
СообщениеДобавлено: Вс сен 23, 2018 11:13 pm 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 239
Благодарил (а): 22 раз.
Поблагодарили: 33 раз.
Пункты репутации: 0
Чтобы найти слабое место надо каждую функцию отдельно в цикле запустить, допустим 1 000 000 шагов и посмотреть, сколько секунд выполнится каждая. Хотя зависит от размера входящих данных, но всё же... Проще объявить задачу и чтобы попробовать разными функциями. Регулярные выражения могут быть быстрее чем Mid.

А в документе ширина символов разная? А то бы проще сразу все в бинарное, а потом перед каждым символом добавить нули регулярным выражением.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как ускорить
СообщениеДобавлено: Пн сен 24, 2018 5:07 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 712
Благодарил (а): 75 раз.
Поблагодарили: 21 раз.
Пункты репутации: 5
AZJIO писал(а):
А в документе ширина символов разная? А то бы проще сразу все в бинарное, а потом перед каждым символом добавить нули регулярным выражением.

вчера до этого додумлся, и ещё свёл всё в один цикл, вместо нескольких последовательных
с 1.8 до 2.5 секунд время выросло если из карты выборку делать в одном цикле
у меня не получается эту строку в памяти собрать, отладчик ругается, говорит выход за предел, сколько б не выделял, ему всё равно мало
Код:
1
s+RSet(Bin(FindString(p, Mid(a(k), u, 1))-1), 6, "0")


а потом чтобы эта строка поняла как это из памяти взять, входящая строка utf8 только английские символы
Код:
1
PokeA(*db2, Val("$"+RSet(Hex(Val("%"+Mid(s, u, 8)), #PB_Byte), 2, "0")))




Сергейчик писал(а):
Нужно на фасме делать.

ну да, только ты единственный кто его хорошо знает, а тут надо функции преобразования написать


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как ускорить
СообщениеДобавлено: Пн сен 24, 2018 9:09 am 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 677
Благодарил (а): 2 раз.
Поблагодарили: 34 раз.
Пункты репутации: 9
newJS писал(а):
мне удалось ускорить, но всё равно долго, основной тормоз эти две строки каждая в своём цикле, целая куча функций работы со строками
основная прибавка, это удаление всех промежуточных переменных и вытягивание в одну строку, о сбирать не строку, а ложить сразу в память, всё остальное дало слишком мало чтобы упоминать
эти циклы короткие, их разворчивание в ленту даёт мизирную прибавку, так что основной тормоз, это встроенные строковые функции
тут я упёрся и незнаю что ещё можно сделать
Код:
1
2
3
s+RSet(Bin(FindString(p, Mid(a(k), u, 1))-1), 6, "0")
 
PokeA(*db2, Val("$"+RSet(Hex(Val("%"+Mid(s, u, 8)), #PB_Byte), 2, "0")))



Что делает Mid(a(k), u, 1),берёт символ с массива с какой то позиции?
Да и лабуда здесь это как кажется конкатенация "s+",зачем она?может лучше "s="?
Ведь ты каждый раз наращивая строку замедляешь работу и кушаешь память.

А после в PokeA( *db2, Val ("$"+RSet( Hex( Val ( "%" + Mid( s, u, 8 ) ), #PB_Byte), 2, "0")))
ещё и ищешь позицию взятия в Mid(s, u, 8 ), когда можно брать Left("This is Art", 4 ) :evil:
PS:Mid(s, u, 8) показывает смайлик на форуме :wink:,да и описание у тебя скудное,нет ни самого цикла(ов) ни постановки задачи,для чего это....


Последний раз редактировалось kvitaliy Пн сен 24, 2018 10:01 am, всего редактировалось 1 раз.
Отступы надо делать, что бы смайлики не появлялись


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как ускорить
СообщениеДобавлено: Вт сен 25, 2018 5:25 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 712
Благодарил (а): 75 раз.
Поблагодарили: 21 раз.
Пункты репутации: 5
Сергейчик писал(а):
Что делает Mid(a(k), u, 1),берёт символ с массива с какой то позиции?
Да и лабуда здесь это как кажется конкатенация "s+",зачем она?может лучше "s="?
Ведь ты каждый раз наращивая строку замедляешь работу и кушаешь память.

сам не понял почему, но если основную строку сначала порезать в массив, то это ощутимо ускоряет весь процесс
тут собирается маленькая подстрока, поэтому и плюс
Сергейчик писал(а):
когда можно брать Left

тут всё просто, Mid() быстрее, поэтому он, когда то замеры делал, тоже скорость была нужна
Сергейчик писал(а):
ни постановки задачи,для чего это....

это распаковка base64, а сами функции упаковки/распаковки я когда то выкладывал, с дури не разобрался что есть встроенные, свои написал, теперь они пригодились
эта строка берёт четыре символа, от каждого символа берёт 6 бит и эти биты складывает в подстроку из 24 бит
с ней вчера разобрался и сделал через память, немного ускорилось
Код:
1
s+RSet(Bin(FindString(p, Mid(a(k), u, 1))-1), 6, "0")


а эта строка режет полученную подстроку по 8 бит и получается три байта, потом CatchImage() создаёт картинку
вот эту строку можно переделать, нужно напрямую брать биты и сразу перегонять их в HEX, а не использовать кучу мелких функций
до меня это только сейчас дошло
Код:
1
PokeA(*db2, Val("$"+RSet(Hex(Val("%"+Mid(s, u, 8)), #PB_Byte), 2, "0")))





так что есть чем развлекаться


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как ускорить
СообщениеДобавлено: Вт сен 25, 2018 8:06 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вт апр 14, 2009 7:22 pm
Сообщений: 362
Благодарил (а): 1 раз.
Поблагодарили: 13 раз.
Пункты репутации: 0
Для работы с битами есть битовая арифметика &|!~ и сдвиги << >>
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
C7.a = 7 ; %00000111
LL.l = -1 ; %11111111111111111111111111111111
*MemoryBuffer = @LL
 
C0.a = PeekA(*MemoryBuffer+0) & C7.a
C1.a = PeekA(*MemoryBuffer+1) & C7.a
C2.a = PeekA(*MemoryBuffer+2) & C7.a
C3.a = PeekA(*MemoryBuffer+3) & C7.a
 
Debug Hex(LL.l,#PB_Long)
 
Debug Hex(C0.a,#PB_Ascii)
Debug Hex(C1.a,#PB_Ascii)
Debug Hex(C2.a,#PB_Ascii)
Debug Hex(C2.a,#PB_Ascii)



Это простой пример гашения двух старших бит.

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как ускорить
СообщениеДобавлено: Вт сен 25, 2018 11:30 am 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 677
Благодарил (а): 2 раз.
Поблагодарили: 34 раз.
Пункты репутации: 9
Устроил тут нам садомазо :shock:
Не даёт коду поболее вот и гадай что там у него за переменные и массивы,а также в каких циклах(е) эти строки кода.
Да вот вопрос,зачем номер позиции брать? :roll:
Походу только пытаешься сделать некую процедуру....
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 
;s+RSet(Bin(FindString(p, Mid(a(k), u, 1))-1), 6, "0")
Global s.s
Dim a.s(3)
a(0)="1"
a(1)="2"
a(2)="3"
a(3)="4"
 
 
 
Debug Mid(a(0), 1, 1);взятие символа с  массива с некой строковой позиции
 
Debug FindString(a(0), Mid(a(0), 1, 1));номер позиции символа в искомого строке
Debug Bin(FindString(a(3), Mid(a(3), 1, 1))-1);зачем нужна позиция искомого символа(а не сам символ)?
Debug RSet(Bin(FindString(a(3), Mid(a(3), 1, 1))-1), 6, "0")
 
s+RSet(Bin(FindString(a(0), Mid(a(0), 1, 1))-1), 6, "0")
s+RSet(Bin(FindString(a(1), Mid(a(1), 1, 1))-1), 6, "0")
s+RSet(Bin(FindString(a(2), Mid(a(2), 1, 1))-1), 6, "0")
s+RSet(Bin(FindString(a(3), Mid(a(3), 1, 1))-1), 6, "0")
 
Debug a(0)
Debug a(1)
Debug a(2)
Debug a(3)
Debug s
 



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как ускорить
СообщениеДобавлено: Вт сен 25, 2018 9:27 pm 
Не в сети
профессор

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 345
Благодарил (а): 1 раз.
Поблагодарили: 13 раз.
Пункты репутации: 0
Цитата:
Нужно на фасме делать.
Да, былобы неплохо, но кто хорошо понимает асм.
Иногда достаточно написать для Poke и Peek, но так чтобы пурик потом неискал переменные и невыдавал что попало.
Просто передать параметры и сделать CALL, это немного кода, а вот чего за этим CALL идет, я смотрел, ого :shock: , текста немерено, вот и тормоз, особенно с текстом.

Цитата:
эта строка режет полученную подстроку по 8 бит и получается три байта, потом CatchImage() создаёт картинку
может лучше для графики без строк-тормозов обойтись и работать с байтими и битами. И как ты уварачиваешься в строках од кодов перевода строк или возврата каретки, там такой каламбур, наверное ты их неиспользуеш. А вижу, переганяеш через base64. А чего через base64,а понимаю, защита!
Хотя,... уже три строки условий If a<i:b=5:EndIf равнозначна по времени Mid

Цитата:
отладчик ругается, говорит выход за предел, сколько б не выделял, ему всё равно мало
Код:s+RSet(Bin(FindString(p, Mid(a(k), u, 1))-1), 6, "0")

FindString и Mid им побарабану твои пределы, ну разве космические числа
Код:
1
2
3
s$="123456416848971646846841 34368413413841343574184"
s1$=Mid(s$,1000000000,100000000)
a=FindString(s$," ",10000000000)


и нисколь у меня не ругается, поэтому ошибка гдето в другом месте.
Цитата:
сам не понял почему, но если основную строку сначала порезать в массив, то это ощутимо ускоряет весь процесс
а для FindString и Mid(чем меньше вырезать) если строка короче то и быстрее.

_________________
искатель истины


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как ускорить
СообщениеДобавлено: Ср сен 26, 2018 9:05 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 712
Благодарил (а): 75 раз.
Поблагодарили: 21 раз.
Пункты репутации: 5
таки разобрался как работать с памятью, и сам почти всё сделал, время выросло до 0.8 секунды и меня это уже устроило, распаковывается файл с 20 картинками общим весом 200кил текста, это немного нестандартное base64, отсюда и заморочки и тормоза, ноги растут отсюда viewtopic.php?f=10&p=90033#p90033

jobless писал(а):
Это простой пример гашения двух старших бит.

жуть какая то :D , но должно быть быстрей чем со строкой работать, попробую
Сергейчик писал(а):
Не даёт коду поболее вот и гадай что там у него за переменные и массивы,а также в каких циклах(е) эти строки кода.

я же сказал, где то я выкладывал эти самодельные функции упаковки/распаковки base64
Сергейчик писал(а):
Да вот вопрос,зачем номер позиции брать?

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

для меня это развлекуха
balex1978 писал(а):
и нисколь у меня не ругается, поэтому ошибка гдето в другом месте.

так и не понял где была ошибка, вдруг всё заработало


это вроде уже не актуально, но всё же, RSet() можно выкинуть, она тут лишняя, хотя скорости это и не прибавит, так, смешные миллисекунды
Код:
1
PokeA(*db2, Val("$"+RSet(Hex(Val("%"+Mid(s, u, 8)), #PB_Byte), 2, "0")))





Сергейчик писал(а):
Не даёт коду поболее вот и гадай что там у него за переменные и массивы,а также в каких циклах(е) эти строки кода.

вот что получилось, М() это карта в которой 6-битовые строки лежат
это и есть основной принцип base64
Код:
1
2
3
4
5
6
7
8
9
10
11
12
While n>*db4
; берём 4 буквы и раскладываем их на биты, потом получаем 3 байта
db+PokeS(*db3+db, m(PeekS(*db4, 1))):*db4+2
db+PokeS(*db3+db, m(PeekS(*db4, 1))):*db4+2
db+PokeS(*db3+db, m(PeekS(*db4, 1))):*db4+2
db+PokeS(*db3+db, m(PeekS(*db4, 1))):*db4+2
; получаем наши 3 байта
PokeA(*db2, Val("$"+Hex(Val("%"+PeekS(*db3, 8)), #PB_Byte))):*db2+1
PokeA(*db2, Val("$"+Hex(Val("%"+PeekS(*db3+16, 8)), #PB_Byte))):*db2+1
PokeA(*db2, Val("$"+Hex(Val("%"+PeekS(*db3+32, 8)), #PB_Byte))):*db2+1
db=0
Wend



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как ускорить
СообщениеДобавлено: Ср сен 26, 2018 9:40 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вт апр 14, 2009 7:22 pm
Сообщений: 362
Благодарил (а): 1 раз.
Поблагодарили: 13 раз.
Пункты репутации: 0
newJS писал(а):
jobless писал(а):
Это простой пример гашения двух старших бит.

жуть какая то :D , но должно быть быстрей чем со строкой работать, попробую

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

p.s. конкретно что и где взять по битно (как в википедии про base64 расписано), что сделать, куда положить.
p.p.s. конкретно это не в терминах твоего представления о функциях PB на эту тему а в виде:
какой БИТ где взять и куда положить, хоть скан картинки рукописной.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как ускорить
СообщениеДобавлено: Ср сен 26, 2018 1:18 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 677
Благодарил (а): 2 раз.
Поблагодарили: 34 раз.
Пункты репутации: 9
А чем отличаются процедуры пурика(или с какой нить dll)от твоих?они что не как в википедии? :roll:
Да и как я понял она кодирует только английский алфавит,и как это применимо к данным картинки если там допустим будут байты отличные от символов? :shock:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
 
Example$ = "This is a test string!"
len.l=StringByteLength(Example$)
  Encoded$ = Space(1024)
  Decoded$ = Space(1024)
   
 
  Debug Base64Encoder(@Example$, len, @Encoded$, 1024)
  Debug Encoded$
   
  Debug Base64Decoder(@Encoded$,len, @Decoded$, 1024)
  Debug Decoded$
 



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как ускорить
СообщениеДобавлено: Чт сен 27, 2018 4:55 am 
Не в сети
профессор

Зарегистрирован: Чт сен 22, 2011 6:21 pm
Сообщений: 278
Благодарил (а): 37 раз.
Поблагодарили: 28 раз.
Пункты репутации: 0
Сергейчик писал(а):
...Да и как я понял она кодирует только английский алфавит...

Она "сжимает" до английского алфавита (заменяет остальные байты на комбинации английских букв), и используется для вставки бинарных фрагментов в чисто-текстовые документы (mail,html...).


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как ускорить
СообщениеДобавлено: Чт сен 27, 2018 6:16 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 712
Благодарил (а): 75 раз.
Поблагодарили: 21 раз.
Пункты репутации: 5
Сергейчик писал(а):
А чем отличаются процедуры пурика(или с какой нить dll)от твоих?они что не как в википедии?

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


jobless писал(а):
Напиши внятное ТЗ, без отсыла к публикациям своим или чужим о которых кроме тебя никто не помнит.

на входе текстовая строка, в строке возможны только 64 символа, но символы могут быть любыми, одни и те же символы используются для упаковки и распаковки
почему не важны символы, да потому что не код символа используется, а его индекс в строке, кодирующих символов 64 и для их кодировки хватает 6 бит, надо полагать отсюда и название base64
как оно делается
на вход приходит сплошная строка в формате utf8
нужно взять 4 символа, для каждого символа найти его индекс в кодируещей строке, перегнать код индекса в биты, взять 6 младших
и так для всех 4 символов
складываем все биты в подстроку из 24 бит
теперь берём три раза по 8 бит, получаем три байта
и это байты исходного файла, то есть получаем назад бинарник

на всякий случай
в реальных файлах base64 в конце могут быть сиволвы =, они не обрабатываются распаковщиком, они нужны упаковщику
так что последние 4 символа отсекаются и обрабатываются отдельно
наверно это не нужно здесь, но на всякий случай


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как ускорить
СообщениеДобавлено: Чт сен 27, 2018 7:12 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вт апр 14, 2009 7:22 pm
Сообщений: 362
Благодарил (а): 1 раз.
Поблагодарили: 13 раз.
Пункты репутации: 0
Я правильно понял, что описан по сути стандартный алгоритм base64, но своя реализация нужна для того что бы например по своему перетасовать индексную последовательность и вуаля получаем простейшее шифрование замаскированное под base64?


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 128 ]  На страницу 1, 2, 3, 4, 5 ... 9  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB