purebasic.info

PureBasic forum
Текущее время: Сб дек 15, 2018 3:16 am

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




Начать новую тему Ответить на тему  [ Сообщений: 128 ]  На страницу Пред.  1 ... 5, 6, 7, 8, 9  След.
Автор Сообщение
 Заголовок сообщения: Re: Как ускорить
СообщениеДобавлено: Ср окт 10, 2018 2:55 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11336
Благодарил (а): 4 раз.
Поблагодарили: 443 раз.
balex1978 писал(а):
Всеодно остается вопрос почему утф неверно считает?
Почему неправильно? В строке s$ ведь 6 символов? Столько же возвращает MemoryStringLength. Если нужно в байтах, следует использовать флаг #PB_ByteLength. Об этом написано в справке.
Код:
1
2
3
4
5
6
7
8
s$="ФЫВА12"
Dim Buff.a(20)
format=#PB_UTF8;#PB_Unicode;#PB_Ascii;
PokeS(@Buff(), s$, -1, format); запхать строку в память в УТФ8
ShowMemoryViewer(@Buff(), 20); можно посмотреть но пурик както криво это отражает - "????12[NULL]"
 
Debug PeekS(@Buff(), -1, format);читаем с памяти
Debug MemoryStringLength(@Buff(),format | #PB_ByteLength);считываем

В левом нижнем углу окна созданного функцией ShowMemoryViewer можно выбрать в каком формате будут отображаться данные.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


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

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 342
Благодарил (а): 1 раз.
Поблагодарили: 13 раз.
Пункты репутации: 0
newJS твой код както запутано написан.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
;генерим длинную строку
For k=0 To 1000
s.s+"123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"
Next
 
c=ElapsedMilliseconds()
*b = AllocateMemory(1000000)
*P = *B
 
 n= CopyMemoryString("", @*b)
    CopyMemoryString(s)
FreeMemory(*p)
 
wq+ElapsedMilliseconds()-c
Debug wq
Debug Str(*b-n); получаем размер строки
 



Может так яснее, правда, коментов больше чем кода :D
Код:
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
29
30
31
32
33
34
35
36
;генерим длинную строку
For k=0 To 1000;0
S.s+"123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"
Next
 
Debug Len(S)
ln=StringByteLength(S.s)
ln2=ln+100;0
 
c=ElapsedMilliseconds()
*start = AllocateMemory(ln2);180000);
*stop =*start+MemorySize(*start)
Debug "сколько выделили памяти:"+Str(MemorySize(*start) )
*mesto_vstavki = *start
 
Debug "сколько останется памяти после вставки(минус знач не влазит):"+Str( MemorySize(*start)-(*mesto_vstavki-*start)-StringByteLength(""))
*mesto_vstavki2= CopyMemoryString("", @*mesto_vstavki)
;после этой команды они будут разны всегда
Debug *mesto_vstavki
Debug *mesto_vstavki2
 
Debug "сколько останется памяти после вставки(минус знач не влазит):"+Str( MemorySize(*start)-(*mesto_vstavki-*start)-StringByteLength(S.s))
Debug " или так(минус знач надо увеличивать) "+Str(*stop-(*mesto_vstavki+StringByteLength(S.s)) )
*mesto_vstavki2=CopyMemoryString(S)
;после этой команды они будут разны всегда
Debug *mesto_vstavki; заметь она тоже изменила свое значение
Debug *mesto_vstavki2
 
Debug "проверка, превысили ли мы лимит выделеной памяти? осталось памяти:"+Str( ln2 -(*mesto_vstavki-*start) )
;можно и так например? но тут не все учтено, хоть для даного места верно.
Debug "размер памяти-размер строки в озу=остаток:"+Str(MemorySize(*start) )+" - "+Str( StringByteLength(S.s))+" = "+Str(MemorySize(*start)-StringByteLength(S.s))
FreeMemory(*start)
 
Debug ElapsedMilliseconds()-C
 
Debug Str(*mesto_vstavki - *start ); получаем размер строки



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

Цитата:
вопрос, а насколько это фокус корректен, можно ли им пользоваться?

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

Цитата:
в качестве недостатка, неизвестно сколько нужно выделять памяти,

проверка влезет строка или невлезет проста как двери, я несколько вариантов вложил
как проверить сколько осталось до конца выделенной памяти.
И перед вставкой новой строки нужно проверить, и если хватает то всталять иначе расширять ОЗУ
Строка ln2=ln+100;0 дополняет лишние байты к строке и их прога вычисляет в конце.

смени эту строку
*start = AllocateMemory(ln2);180000);
на(выделяем меньше чуть чем твоя строка и: :o )
*start = AllocateMemory(180000);
и покажет выезд за пределы выделеной памяти, ну у меня заодно и вылет проги. :lol:

Цитата:
приходится выделять много,
нужно выделять столько сколько требуется с учетом некоего запаса, а при надобности запросить еще(сохранив даные).
Только AllocateMemory после увеличения размера может переехать на новый адрес и твоим даным прийдет конец, вот код например так проверял
Код:
1
2
3
4
5
6
7
8
9
*a= AllocateMemory(100)
Debug *a
PokeB(*a,12)
Debug PeekB(*a)
 
b=ReAllocateMemory(*a,100000)
 
Debug b
Debug PeekB(*a)


4136592
12 это туда записал
32899144 после увеличения размера память переехала на новое место
-16 читаем, а там бред, пурик не перенес наши даные туда в новое место :cry:
Нужно создавать новую облать памяти и побольше прежней и туда копировать, а первоначальную удалять и работать уже с новой.

Цитата:
памяти, приходится выделять много, но она тут же освобождается

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

Цитата:
так и не понял как копирование с такой скоростью происходит
Ну вот так:
Код:
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
29
30
ln=4000000
*a=AllocateMemory(ln)
*b=AllocateMemory(ln*10)
 
;чегото запишем в первый байт
PokeB(*a+1,12)
 
;смотрим чего записано
For i=o To 5
    Debug PeekB(*a+i)
Next
Debug "=============="
;копируем с одного ОЗУ во вторую
t=ElapsedMilliseconds()
For i=o To ln
    c=PeekB(*a+i): PokeB(*b+i,c)
Next
Debug "=======ElapsedMilliseconds======="
Debug ElapsedMilliseconds()-t
 
t=ElapsedMilliseconds()
CopyMemory(*a,*b, ln)
Debug "=======ElapsedMilliseconds===CopyMemory()===="
Debug ElapsedMilliseconds()-t
 
Debug "=============="
;смотрим что скопировали ва второй ОЗУ
For i=o To 5
    Debug PeekB(*b+i)
Next



на асемблере быстрей получается :D
результат
2078 это так копирую c=PeekB(*a+i): PokeB(*b+i,c); правда если использовать не байт Ϫсразу 4 то быстрее
=======ElapsedMilliseconds===CopyMemory()====
47

заменив на такие строки
For i=o To ln/4
c=PeekL(*a+i): PokeL(*b+i,c)
Next
странно, но и CopyMemory() ускорилась :roll: , думал меньше памяти копирует так нет вроде
531
=======ElapsedMilliseconds===CopyMemory()====
16

восьми байтовое копирование
266
=======ElapsedMilliseconds===CopyMemory()====
15

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

Пора прекращать мемуары писать.

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


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

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 342
Благодарил (а): 1 раз.
Поблагодарили: 13 раз.
Пункты репутации: 0
Цитата:
Ещё более обобщённо в голове должно всё уложиться: Начиная с указанного адреса ищем байт %00000000 и подсчитываем по байтно не равные нулю если #PB_Ascii, по словно(2 байта) если #PB_Unicode и наконец если #PB_UTF8 анализируем старшие биты, а на основе анализа вычисляем по байтно, по словно или больше(как по битно формируется utf8 расписано в википедии).
гдето, чтото приблизительно понял.


Цитата:
Почему неправильно? В строке s$ ведь 6 символов? Столько же возвращает MemoryStringLength. Если нужно в байтах, следует использовать флаг #PB_ByteLength. Об этом написано в справке.
Спасибо но на пурике 5.21 этой константы нету
А в справке так написано:
Цитата:
Syntax

Result = MemoryStringLength(*String [, Flags])
Description

Returns the length (in characters) of the given zero terminated string.
Parameters

*String The address of the string to get the length from.
Flags (optional) The string format to use. This can be one of the following values:
#PB_Ascii : Reads the strings as ascii
#PB_UTF8 : Reads the strings as UTF8
#PB_Unicode: Reads the strings as unicode

The default is #PB_Unicode if the program is compiled in unicode mode and #PB_Ascii otherwise.

Return value

Returns the length of the string in characters.

И ни слова про #PB_ByteLength.
Кстати на пурике 5.62(скачан с офсайта) твой код дал 10 символов, менял и формат файла плайн и утф всеодно 10 :( .

Сменил на 64 на пурике 5.21 и ответ 10, ну и ладно, пускай как ему(пурику) удобно :roll:.

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


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

Зарегистрирован: Вт апр 14, 2009 7:22 pm
Сообщений: 362
Благодарил (а): 1 раз.
Поблагодарили: 13 раз.
Пункты репутации: 0
https://www.purebasic.com/documentation ... ength.html

Syntax

Result = MemoryStringLength(*String [, Flags])
Description
Returns the length (in characters) of the given zero terminated string.
Parameters

*String The address of the string to get the length from.
Flags (optional) The string format to use. This can be one of the following values:
#PB_Ascii : Reads the strings as ascii.
#PB_UTF8 : Reads the strings as UTF8
#PB_Unicode: Reads the strings as unicode (by default, see unicode mode).
Combined with one of the following value:
#PB_ByteLength: only valid when using the #PB_UTF8 flag, the result will represent bytes (not characters).
it can be useful as UTF8 have variable characters lengths.
Return value

Returns the length of the string in characters.

https://habr.com/post/138173/

Символы с кодами меньше 128 представляются одним байтом, а так как в Юникоде они повторяют ASCII, то текст написанный только этими символами будет являться текстом в ASCII. Символы же с кодами от 128 кодируются 2-мя байтами, с кодами от 2048 — 3-мя, от 65536 — 4-мя. Так можно было бы и до 6-ти байт дойти, но кодировать ими уже ничего.
0x00000000 — 0x0000007F: 0xxxxxxx
0x00000080 — 0x000007FF: 110xxxxx 10xxxxxx
0x00000800 — 0x0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
0x00010000 — 0x001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx


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

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 342
Благодарил (а): 1 раз.
Поблагодарили: 13 раз.
Пункты репутации: 0
Спасибо jobless за детализацию.

Именно этой строчки в моем справочнике нету, да и константу такую не переваривает пурик и число 64 вместо нее на пурик не влияет, всеодно 10 выдает, хоть тресни
Цитата:
#PB_ByteLength: only valid when using the #PB_UTF8 flag, the result will represent bytes (not characters).
it can be useful as UTF8 have variable characters lengths.
подумал может былть од старой версии скпоирована, но нет
Цитата:
History
20th November 2013 : Version 5.21 LTS


jobless писал(а):
Так можно было бы и до 6-ти байт дойти, но кодировать ими уже ничего.
из википедии
Цитата:
однако в ноябре 2003 года стандарт RFC 3629 запретил использование пятого и шестого октетов, а диапазон кодируемых символов был ограничен символом U+10FFFF. Это было сделано для обеспечения совместимости с UTF-16.
Наверное было мало. :)

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


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

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 674
Благодарил (а): 2 раз.
Поблагодарили: 34 раз.
Пункты репутации: 9
Мне то как раз всё понятно что у меня. :D
Это то что память у реаллокате выделяется с новым адресом
но надо курить или глобал аллок или хеапаллок(там поверхностно посмотрел есть флаги что адрес нового распределения памяти сохраняется прежний) :roll:
А считать сколько байт выделить для кодировки я и сам могу написать процедуру(я про это и речь не вёл) :wink:
PS:Вот же выкладывал подсчёт символов утф-8 viewtopic.php?f=19&t=4761
так если перекодировать в утф 16 умножай на два а то что утф16 может иметь и 4 байта всё равно виндой не поддерживается. :roll:
Можете еще для кодировок покурит либу iconv.lib. :wink:


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

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 342
Благодарил (а): 1 раз.
Поблагодарили: 13 раз.
Пункты репутации: 0
Цитата:
Это то что память у реаллокате выделяется с новым адресом
ну да, гдето пример приводил с выводом адресов, вот для масива это неважно, пурик сам перемещает.

Цитата:
но надо курить или глобал аллок или хеапаллок(там поверхностно посмотрел есть флаги что адрес нового распределения памяти сохраняется прежний)
что за глобал аллок или хеапаллок :?: а вот нашел GlobalAlloc, GMEM_FIXED
http://www.frolov-lib.ru/books/bsp/v13/ch2_3.htm

Цитата:
А считать сколько байт выделить для кодировки я и сам могу написать процедуру(я про это и речь не вёл)
а мне чегот показалось, но в любом случае это пример приводил для newJS

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


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

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 674
Благодарил (а): 2 раз.
Поблагодарили: 34 раз.
Пункты репутации: 9
Посмотрел сейчас функцию
Код:
1
Debug LocalCompact_(0)

Так она показывает 921600 байт
Это типа локальной из кучи глобалалок(что на прогу выделено?)
А я вот при тестах думаю почему у меня строка lset() расширяется до 800млн символов*2(утф16)
а реаллокате виснет(может эта строка на буфер диска пишется?) :roll:


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

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

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

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



jobless писал(а):
Мне не понятно с какой целью? Я всё это время именно об этом спрашиваю, ведь base64 это средство а не цель.

а зачем тебе мои цели? что за странный интерес к моим делам
jobless писал(а):
Каким боком к CatchImage() относится символ

да ни каким, я написал что эти символы можно проигнорить и не обрабатывать их отдельно от основного цикла
прочти ещё раз что там написано


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

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

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

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



jobless писал(а):
Мне не понятно с какой целью? Я всё это время именно об этом спрашиваю, ведь base64 это средство а не цель.

а зачем тебе мои цели? что за странный интерес к моим делам
jobless писал(а):
Каким боком к CatchImage() относится символ

да ни каким, я написал что эти символы можно проигнорить и не обрабатывать их отдельно от основного цикла
прочти ещё раз что там написано

Во первых как ускорить это не мой вопрос, а твой. Предполагая твои цели на 300% уверен, что ответ на него прежде всего не использовать метод который ты пытался ускорять.
А дальше я прекращаю участие в этом диалоге. Пусть кто то другой тебе скажет, что даже последнее твоё возражение про возможность что то игнорировать похоже на бред.
Надеюсь чем то я тебе всё таки помог. :)


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

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 342
Благодарил (а): 1 раз.
Поблагодарили: 13 раз.
Пункты репутации: 0
Сергейчик писал(а):
А я вот при тестах думаю почему у меня строка lset() расширяется до 800млн символов*2(утф16)
а реаллокате виснет(может эта строка на буфер диска пишется?) :roll:

800млн символов*2
800 000 000*2=1 600 метров, ну если физической ОЗУ 2 гига то понятно что виснет, для одной проги+система+ сервисные программы(анвирус и прочее), сюда несчитаются те которые вошли на винт как виртуальные ОЗУ и работают в фоне. Ну при таком розкладе основа должна быть в ОЗУ а ее ты всю захавал.

Так зачем тебе столько памяти? Что за забор городиш :?:
Что значит -"реаллокате виснет", она неспособна выделить тебе сколько запросил и пытается все дефрагментировать так чтобы выдать запрошеную часть.

Ответь на повторный вопрос,зачем текту столько места 1,6 гиг :shock: :?: .
Запхни его в бинарный масив и забудь про AllocateMemory и делай себе редим, может од таких размеров нетак будет виснуть. При таких размерах для AllocateMemory нужно его в 2.2 раза больше чем реально, хоть и потом освободится старый участок ОЗУ.


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

Код:
1
2
3
4
5
6
7
8
9
10
11
12
For i=0 To 1000
    a$+Chr(Random(100)+32 )
Next
Debug a$
 
t=ElapsedMilliseconds()
For i=0 To 100000
    Len(a$)
    ;StringByteLength(a$)
Next
 
Debug ElapsedMilliseconds()-t


100000*1000(1 кБ текста)=100 000 000байт

обе функциидают 170 милисек, а у тебя в 500 раз даных меньше это меньше 1 милисек,
хотя это теория и функций неодна, тестить надо.

проверил добавление строки 90 символов и 90 000(как ты сделал) несильно различается по скорости на фоне остальных действий в той проге о которой ты говориш.
У тебя там по твоим словам всего 200 килобайт даных.
При проверке и сумированию на такой размер памяти дает 0-5 времени в милисекундах.
Для 20 000 000(20 метров) дало прибавку всего 0.141 сек это быстрее в 100 раз, ты о чем. И это при включеном дебугере, да я согласен что там еще стоит твой декодер, ну если 200 кБ за 0.005 сек, недумаю что твоя прога сильно затормозится.

Держи код проверки, я лишнее закоментировал и немного переделал(там много лишнего может быть)
Код:
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
;генерим длинную строку
For k=0 To 1000;0
S.s+"123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"
Next
 
Debug Len(S)
ln=StringByteLength(S.s)
ln2=ln+100;0
Debug Ln
 
c=ElapsedMilliseconds()
*start = AllocateMemory(20000000);ln2);180000);
MemSize=MemorySize(*start)
 
 
*stop =*start+MemorySize(*start)
Debug "сколько выделили памяти:"+Str(MemSize )
*mesto_vstavki = *start
 
Debug "сколько останется памяти после вставки(минус знач не влазит):"+Str( MemSize-(*mesto_vstavki-*start)-StringByteLength(""))
*mesto_vstavki2= CopyMemoryString("", @*mesto_vstavki)
;после этой команды они будут разны всегда
Debug *mesto_vstavki
Debug *mesto_vstavki2
 
For i=0 To 120;100
;     Debug "сколько останется памяти после вставки(минус знач не влазит):"+Str( MemSize-(*mesto_vstavki-*start)-StringByteLength(S.s))
;     Debug " или так(минус знач надо увеличивать) "+Str(*stop-(*mesto_vstavki+StringByteLength(S.s)) )
    If *stop-(*mesto_vstavki+StringByteLength(S.s) )<1:Break:EndIf
   
    *mesto_vstavki2=CopyMemoryString(S)
    ; ;после этой команды они будут разны всегда
    ; Debug *mesto_vstavki; заметь она тоже изменила свое значение
    ; Debug *mesto_vstavki2
    ;
    ; ; Debug "проверка, превысили ли мы лимит выделеной памяти? осталось памяти:"+Str( ln2 -(*mesto_vstavki-*start) )
    ; ; ;можно и так например? но тут не все учтено, хоть для даного места верно.
    ; ; Debug "размер памяти-размер строки в озу=остаток:"+Str(MemSize )+" - "+Str( StringByteLength(S.s))+" = "+Str(MemSize-StringByteLength(S.s))
Next
 
FreeMemory(*start)
 
Debug ElapsedMilliseconds()-C
 
Debug Str(*mesto_vstavki - *start ); получаем размер строки



Цитата:
Сергейчик сделай тоже самое для аски
Ты имееш введу Анси, я просил написать но чегото он непонял чего я его прошу, ДА ДАВАЙ НАПИШИ.
Но твоя проблема код то в УТФ8, хотя для базе64 это аналогично как для Анси, короче пиши, мы в ожидании этого чуда :) .

jobless писал(а): писал(а):
Мне не понятно с какой целью?
Ну если знать более менее детально(кроме секретов) то можно сделать более простой и быстрый способ решения задачи чем часто думает автор, иногда вцепившись двумя руками и зубами в свою идею. Довольно часто вижу как предлагают более простой способ решения, чем автор(это я не про newJS, а в целом).

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


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

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 342
Благодарил (а): 1 раз.
Поблагодарили: 13 раз.
Пункты репутации: 0
jobless писал(а):
А дальше я прекращаю участие в этом диалоге.
Ну вот :cry:


А еще дополнение по вопросу:
newJS писал(а):
выделять заведомо много, а отсюда и второй вопрос, насколько такой способ корретен
то что этот способ будет не всегда приемлем, это факт, смотря какая строка, так что вопрос корректности самого способа остаётся

-не много памяти выделять нужно, а у тебя файлик в 200 кБ вот и выделяй под его размер, ну мож 250 кБ, думаю и 1 МБ ничего не изменит. В большинстве случаев это все предсказуемо и поэтому просчитываемо, вот с текстовым редактором неизвестно, но там скорость неважна, ну небудет пользователь печатать со скоростъю 10 млн символов :shock: в секунду :lol: :lol: :lol: :lol: :lol: А Ха ХА, я умираю.
-А это интересно-"смотря какая строка" что значит :?:

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


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

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 342
Благодарил (а): 1 раз.
Поблагодарили: 13 раз.
Пункты репутации: 0
Крутил, и неполучается, может кто знает как сделать.

Вот существуют стандартные размеры структур по 1=b, 2=w, 4=L, 8=Q байт, и сложные структуры которые имеют обычно комбинации этих выше приведенных структур.

Вот пример для записи и чтения "структуры" в 2 байта:
A.W=123 где W уже определена как 2 байта.

Вопрос как сделать такое но на 3 байта структуру задав ей новое имя и чтобы можно в нее писать и читать только 3 байта и число не более 256*256*256=16 777 216.
Т. е. получается не 2 и не 4 байта, а три.
Уже и круглые и квадратные скобки лепил ...и незнаю чего еще прилепить, может бантик.

Вот для строки можно сделать приблизительно так и то при компиляторе анси.
Код:
1
2
3
4
5
6
7
8
9
10
11
; запускать только при компиляторе Анси
Structure mm
    N.s{3}
EndStructure
 
in.mm\N.s="1234";тут символ 4 лишний и незапишется в структуру
Debug in.mm\N.s
 
ShowMemoryViewer( @in.mm\N.s,100)
 
; тогда получится такой набор 00431DCC  31 32 33 00


а мне нужно аналогично но только для числа и только для 3 или 5 или 6 или 7 байт, ну короче нестандартного числа.

Е если можно для большего, но тогда получается типа строки, но при этом чтобы небыло ноля в конце(во губу розкатал :roll: )
Такое можно осуществить или это нереально?

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


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

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 674
Благодарил (а): 2 раз.
Поблагодарили: 34 раз.
Пункты репутации: 9
Ответ на предыдущий пост.
Мне может и ненужно столько памяти,просто я это увидел когда делал тесты (своей комбинации что выкладывал и стандартной пуриковской)они шли в ровень и я ах-хах решил добавить им проверки(не думая что для этого нужно было использовать предыдущию область памяти)тупо выделял новую с таким же числом байтов и проходя тест моей рукописи, прога висла на втором тесте(хотя условно редимил в 0(используя в 1 тесте массив ))... :D
В целом почитав про выделяемую память что Сейчас присутствующие глобалаллок и т.д. просто обёртки над хеапаллок и т.д.,а они в моих пробах(код ниже)
Код:
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
 
#HEAP_CREATE_ENABLE_EXECUTE=$00040000
#HEAP_GENERATE_EXCEPTIONS=$00000004
#HEAP_NO_SERIALIZE=$00000001
#HEAP_REALLOC_IN_PLACE_ONLY=$00000010
#HEAP_ZERO_MEMORY=$00000008
Structure MEMORYSTATUSEX2
  dwLength.l;размер структуры
   dwMemoryLoad.l;%используемой памяти
   ullTotalPhys.l;Объем фактической физической памяти в байтах
  ullAvailPhys.l;Объем доступной физической памяти в байтах.Это объем физической памяти, который может быть повторно использован повторно, без необходимости сначала записать его содержимое на диск. Это сумма размера резервных, бесплатных и нулевых списков
 ullTotalPageFile.l;Это физическая память плюс размер файла страницы(подкачки?), за вычетом небольших накладных расходов.
  ullAvailPageFile.l;Максимальный объем памяти, который может обрабатывать текущий процесс, в байтах.Это значение должно быть меньше доступного для всей системы фиксации. Чтобы вычислить это значение, вызовите GetPerformanceInfo и вычтите значение CommitTotal из CommitLimit .
  ullTotalVirtual.l;Размер части пользовательского режима виртуального адресного пространства
   ullAvailVirtual.l;Объем незарезервированной и незафиксированной памяти, находящейся в пользовательском режиме виртуального адресного пространства вызывающего процесса, в байтах.
 ;ullAvailExtendedVirtua.l MEMORYSTATUSEX structure
EndStructure
statux.MEMORYSTATUSEX2
statux\dwLength = SizeOf(statux)
GlobalMemoryStatus_(@statux);устаревшая
Debug statux\dwMemoryLoad
Debug statux\ullTotalPhys
Debug statux\ullAvailPhys
Debug statux\ullTotalPageFile
Debug statux\ullAvailPageFile
Debug statux\ullTotalVirtual
Debug statux\ullAvailVirtual
 
*globalmem=HeapCreate_(#HEAP_CREATE_ENABLE_EXECUTE,500000,0);Если функция завершается успешно, возвращаемое значение является дескриптором вновь созданной кучи
PokeA(*globalmem,68)
Debug PeekA(*globalmem)
Debug *globalmem
*mem=HeapAlloc_(*globalmem,#HEAP_GENERATE_EXCEPTIONS,200000)
 
 
 
;Debug HeapCompact_(*globalmem,#HEAP_NO_SERIALIZE)
 
Debug HeapSize_(*globalmem,#HEAP_CREATE_ENABLE_EXECUTE,*mem)
 
*mems=HeapReAlloc_(*globalmem,#HEAP_REALLOC_IN_PLACE_ONLY|#HEAP_ZERO_MEMORY,*mem,100000)
Debug HeapSize_(*globalmem,#HEAP_GENERATE_EXCEPTIONS,*mems)
 
Debug *mem
Debug *mems
 
HeapFree_(*globalmem,#HEAP_NO_SERIALIZE,*mem)
HeapDestroy_(*globalmem);удаление
 


Показывают что да если выделено в куче энное количество байт и мы реаллочим локально в этих пределах то да адрес новой выделенной памяти в этом пределе кучи(при определённых флагов) тот же,а вот за её пределами похоже нет так как функция сизе делает проги аут(может я что то не так делаю?). :wink:
В общем пока смысл такой что реаллочить динамически возможно но в большой предварительно выделенной области памяти что =зачем это нужно,если можно заранее выделить по максимуму.... :evil:
PS:Насчёт что то написать newdjesu,нужно как минимуум точно знать что ему нужно.
А то что структуру вам нужна дивная то наверное можно сделать такую только вот её обработку нужно будет продумывать (если невозможно уложиться в свои функции то придётся писать)
PS:Может это нужно ему?
https://translate.google.ru/translate?h ... ws/desktop


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

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 342
Благодарил (а): 1 раз.
Поблагодарили: 13 раз.
Пункты репутации: 0
Сергейчик писал(а):
Ответ на предыдущий пост.

А то что структуру вам нужна дивная то наверное можно сделать такую только вот её обработку нужно будет продумывать (если невозможно уложиться в свои функции то придётся писать)


я уже подумал что не туда запхал свой ответ, оказалось нет.

========================================
Про структуру я спрашивал может есть какойто несложный метот, но если нету то писать ничего ненужно.

По поводу прозьбы написать, повторюсь, как я понял: есть строка в анси(00) и уникоде(00 00), любая строка заканчивается нолем(признак конца).
Нужен код на АСМе который получает адрес строки и подсчитывает быстро сколько байт или букв, но я думаю скорее всего адрес где находится этот ноль. Остальное можно подсчитать и так отняв адрес начального стартового од конца строки, а вот с УТФ8 тут даже незнаю.
Просто это для тебя будет дела на десять минут.

========================================
Сергейчик ты пробовал такой вариант который я написал для ускорения заполнения масива строками
viewtopic.php?f=1&t=4950&p=90384#p90376
подходит или как :?:

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


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

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


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

Сейчас этот форум просматривают: Bing [Bot], Google [Bot] и гости: 10


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

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