:: Visual Foxpro, Foxpro for DOS
Re: Удаление лишних пробелов
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
spinz
Пришла щас в голову мысль заменить SCASB на SCASW - одиночные пробелы нас ведь все равно не интересуют. Это может сушественно улучшить перфоманс
Я про это и говорил - "укрупнять" единицу обработки, но... Там же алгоритм сразу бахнет на порядок по сложности. "Пара" то может аккурат на границе WORD-ов быть... А если до DWORD-ов дойти (что по идее ещё быстрее в плане тупого копирования блоков памяти, разве что на x64 процессорах в соответствующих режимах уже по 8 байт оптимальнее будет пересылать), то я даже боюсь представить как он должен выглядеть
Ну и да, что-то вы никак не хотите ОДНУ И ТУ ЖЕ строку схлопывать - т.е. по сути Dest=Src сделать (потом то "текущий записываемый" символ уже "отставать" будет от текущего считываемого). Хотя я не в курсе, является ли оптимальным для современного процессора писать в только что считанные адреса - со всеми его Out-of-Order да 3-этажными кэшами...
Ну и да, как тупая идея - распараллеливание задачи. Порезать строку на 4 части, отправить 4 (или больше, смотря сколько ядер в наличии) "схлопывающим" потоками, потом уж результаты сцепить. Вполне возможно что на гигабайтных данных это себя многократно оправдает
P.S. чтобы не бороться с лимитом фоксовой строки можно использовать memo поле как промежуточный буфер. Хотя ничем не хуже будет предварительная подготовка файлика через FWRITE (быстро, просто, без проблем до 2 Гб раздует, хотя я не думаю что более 300Мб стоит в эксперимент брать - тупо фоксу памяти не хватит даже всего на 4 копии - 2 переменные и 2 блока памяти подготовленные для DECLARE DLL вызова - "напрямую" фокс значение переменной не отдаст в такую функцию), ну и потом FILETOSTR...


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Удаление лишних пробелов
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
wow1970
А, сорри! Мне показалось, что тема от том как удалить лишние пробелы.
"Как удалить пробелы" написано в первых 3 сообщениях. Ничего нового в "вариациях" самых разных нагромождений STRTRAN-ов лично я не вижу. Ну кроме очевидных ошибок для "непредусмотренных" случаев. Конкретно по твоему - кто сказал что в строке не будет CHR(0), и что если он там будет его МОЖНО удалять? Твоя спекуляция/додумывание над условиями задачи... В условии, кстати, не оговорён и максимальный размер "строки" - если это данные в мемо-поле, то там запросто поместится почти 2Гб буковок.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Удаление лишних пробелов
Taran

Сообщений: 13625
Откуда: Красноярск
Дата регистрации: 16.01.2008
spinz
m.st2= ;
chr(0x55)+chr(0x89)+chr(0xE5)+chr(0x9C)+chr(0x57)+chr(0x56)+chr(0x50)+chr(0x53)

m.st2= 0h5589E59C57565053
Выклядит компактнее, исполняется в 10 раз быстрее и ... о чудо. Места на диске занимает меньше (без учета кластеров конечно или че там нынче). ;)
Ratings: 0 negative/0 positive
Re: Удаление лишних пробелов
Taran

Сообщений: 13625
Откуда: Красноярск
Дата регистрации: 16.01.2008
Фоксисты живые и не ленивые.
Проверьте идею на приблизительно реальных данных.
Разложить строку в массив и собрать обратно. Разделитель - естественно пробел. Опции помнится есть чтоб отбросить ведущие пробелы и пустые элементы.
Сам бы сделал - не на чем.

P.s. не плохо бы чтобы это сделал топикстартер. Первую мою идею и эту сравнил по времени и ...



Исправлено 1 раз(а). Последнее : Taran, 14.01.18 07:16
Ratings: 0 negative/0 positive
Re: Удаление лишних пробелов
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
Igor Korolyov
Это Симпла по простоте (он же человек простой, так и написал в нике ) может считать что FPD "сам по себе" работает, никакими сервисами ОС не пользуется

Ой, да ладна.

В свое время я таки довольно подробно изучал MS-DOS, и даже был единственным одмином на немаленьком предприятии, когда еще не было доступа к инету. И всё работало и ремонтировалось - отмазки железячников или продавцов компов не канали. \m/ Так что не надо ля-ля. [sm128]

Что же касаемо работы FPD из-под "чистого" DOS и из-под NTVDM. В свое время сравнивал работу приложений FPD и в одном, и в другом случае, проверяя на скорость работы в самых ресурсоемких режимах типа "Индексирование всех массивов" или фильтрующего индекса по условию через AT().
Разница в скорости была более чем заметна, когда речь шла о выполнении приложения из-под NTVDM.
Ratings: 0 negative/0 positive
Re: Удаление лишних пробелов
Taran

Сообщений: 13625
Откуда: Красноярск
Дата регистрации: 16.01.2008
И чуток про фокс. (Если можно конечно, и асмофилы будут не против?)

Вероятно в некоторых ситуациях мой первый пример с циклом нужно предварить след.
If space(100) $ myText
myText = strtr(myText, space(100),space(1))
Endif
If space(10) $ myText
myText = ...



Исправлено 1 раз(а). Последнее : Taran, 14.01.18 09:37
Ratings: 0 negative/0 positive
Re: Удаление лишних пробелов
spinz

Сообщений: 5263
Дата регистрации: 21.01.2016
Taran
m.st2= 0h5589E59C57565053
Выклядит компактнее, исполняется в 10 раз быстрее

Но нечитабельно же совершенно.
Ratings: 0 negative/0 positive
Re: Удаление лишних пробелов
Taran

Сообщений: 13625
Откуда: Красноярск
Дата регистрации: 16.01.2008
spinz
Taran
m.st2= 0h5589E59C57565053
Выклядит компактнее, исполняется в 10 раз быстрее

Но нечитабельно же совершенно.

Чего там читать то. Ты прям машинные коды все помнишь? Кроме 0х90. Ну и короткий jamp вероятно.
Тут же речь не про читабельность, а за скорость.
Да и читабельность.
Или страница chr'ов или пара строк в hex строке.
Ratings: 0 negative/1 positive
Re: Удаление лишних пробелов
spinz

Сообщений: 5263
Дата регистрации: 21.01.2016
Taran
Ты прям машинные коды все помнишь?

Да нет конечно, я совсем про другое. В такой сплошной строчке найти опечатку сложней.
Ratings: 0 negative/0 positive
Re: Удаление лишних пробелов
spinz

Сообщений: 5263
Дата регистрации: 21.01.2016
Млять, долбаный каспер! После небольшой модификации алго, он результирующий экзешник стал считать трипером и сразу удаляет его с диска.

Интересно, это у него сигнатуры или эвристика срабатывает.
Ratings: 0 negative/0 positive
Re: Удаление лишних пробелов
Taran

Сообщений: 13625
Откуда: Красноярск
Дата регистрации: 16.01.2008
spinz
Млять, долбаный каспер! После небольшой модификации алго, он результирующий экзешник стал считать трипером и сразу удаляет его с диска.
Интересно, это у него сигнатуры или эвристика срабатывает.

Ну это нормально.
Вообще асм это конечно песня для программиста.
В начале 90х увлекался. Прмню казус.
Делаю "мощную" софтину в 56 байт. Естественно .com. Пароль из биоса прочитать. (В то время это было возмозможно).
Запускаю. Мои 56 байт превращаются в 2кб.
Мозг сломал, пока кто-то не возопил про вирус на машине.
Ratings: 0 negative/0 positive
Re: Удаление лишних пробелов
spinz

Сообщений: 5263
Дата регистрации: 21.01.2016
Taran
Пароль из биоса прочитать.
А смысл? Он же шифрованный.

Я делал по-другому. В те времена на любой машине был досовский отладчик debug.com. Вот в нем я набирал несколько строчек для обнуления CMOS-памяти (порты 70 и 71) и вуаля, пароля больше нет.
Ratings: 0 negative/0 positive
Re: Удаление лишних пробелов
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Taran
Разложить строку в массив и собрать обратно.
Даже в сравнении с имеющимся в foxtools reduce гарантировано проиграет, и смысл тогда?
Taran
Вероятно в некоторых ситуациях мой первый пример с циклом нужно предварить след.
Можно, и даже без IF-ов. По логике если уж и делать "разноурезание" то степенями двойки ходить, а не 100/10. Впрочем я ещё раз замечу - принципиальной разницы между любого вида нагромождением strtran-ов нет. Гигантская строка - и всё, привет. А если плёвое 100-символьное поле, то и смысла изгаляться нет.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Удаление лишних пробелов
spinz

Сообщений: 5263
Дата регистрации: 21.01.2016
Не, SCASW это не то, никакого прироста. Да его по сути и не могла быть, это я тупанул. Мой алгос же тупо ищет непрерывные последовательности непробельных символов и копирует их в результирующий буфер, вставляя между ними пробел. Поэтому поиск двойных пробелов тут не роляет.

Возникла другая мысль, предварительно "разогревать" кэш. Т.е. работать с небольшими блоками, скажем 512к, которые гарантированно умещаются в L2 кэш современных процов. Сперва пробегаемся по такому блоку, читая по одному байту, с шагом 64 байта (т.к. линейка кэша именно 64). Таким образом все 512к окажутся в кэше. А потом уже ищем нужные последовательности.
Ratings: 0 negative/0 positive
Re: Удаление лишних пробелов
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Simple777
Разница в скорости была более чем заметна, когда речь шла о выполнении приложения из-под NTVDM.
Потому что с тем же диском работал не NTVDM (как обычное win32 приложение, он не может напрямую с железом работать - да и "эмулируемым" прогам этого не позволит), ну и не убогий 16-битный DOS, а б-гомерзкий Windows через свои проклятые API функции, которые так и норовят свалить VFP в с005


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Удаление лишних пробелов
Taran

Сообщений: 13625
Откуда: Красноярск
Дата регистрации: 16.01.2008
spinz
Taran
Пароль из биоса прочитать.
А смысл? Он же шифрованный.

Я делал по-другому. В те времена на любой машине был досовский отладчик debug.com. Вот в нем я набирал несколько строчек для обнуления CMOS-памяти (порты 70 и 71) и вуаля, пароля больше нет.

В начале IBM изации пароль был открыт.
А про debug именно я и имел в виду. В нем и создавал первые "шедевры".
Ratings: 0 negative/0 positive
Re: Удаление лишних пробелов
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
spinz
Возникла другая мысль, предварительно "разогревать" кэш.
Полагаю что для любого процессора старше первых пней (там L2 и не было - по крайней мере на чипе или в картридже как для P2) это лишь навредит. Процессор и сам занимается упреждающим чтением и даже спекулятивным исполнением команд (нагружает конвейер). Не надо ему мешать.
Мануалы вообще советуют писать как можно более простой и очевидный код, безо всяких "изысков".
Кстати, проверять все ваши примеры следует со стороны фокса, а не внутри ассемблерного кода. Т.к. вы по любому используете копирование строки для осуществления этого самого вызова - а при использовании того же FoxAPI копирования можно избежать. По крайней мере двойного.
И не прямым запросом RDTSC, который на многоядерных системах может "чудить". msdn.microsoft.com


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Удаление лишних пробелов
spinz

Сообщений: 5263
Дата регистрации: 21.01.2016
Igor Korolyov
Процессор и сам занимается упреждающим чтением и даже спекулятивным исполнением команд (нагружает конвейер). Не надо ему мешать.

Так оно, однако тем не менее интеловцы запилили команду PREFETCHx именно для упреждающего чтения в кэш. И я встречал немало примеров, иллюстрирующих значительный прирост скорости при использовании этой инструкции.
Ratings: 0 negative/0 positive
Re: Удаление лишних пробелов
Taran

Сообщений: 13625
Откуда: Красноярск
Дата регистрации: 16.01.2008
Igor Korolyov
Даже в сравнении с имеющимся в foxtools ...
Можно, и даже без IF-ов.
...
степенями двойки ходить, а не 100/10. ...
Гигантская строка - и всё, привет. А если плёвое 100-символьное поле, то и смысла изгаляться нет.
Про foxtools речи нет. Речь о чистом фоксе.
Ифы для исключения лишнего создания копии переменной. Вдруг ...
Степени двойки .... вероятно. Но как оно конкретно в фоксе. Возможно это просто треп.
Гигантская строка это сколько и откуда она.

А вот очистить банальное ФИО от лишних пробелов или текст из вне пару-десяток страниц.
Вполне вероятно эти маленькие и простые команды помогут.
А вот городить вставку на ассемблере без анализа потерь на каждую окружающую операцию я бы не стал.
Данные взять, преобразовать, сохранить.
Какова ожидаемая доля экономии при вставке маш.кодов?
И.... цена сопровождения.
Ratings: 0 negative/0 positive
Re: Удаление лишних пробелов
spinz

Сообщений: 5263
Дата регистрации: 21.01.2016
Taran
А вот городить вставку на ассемблере без анализа потерь на каждую окружающую операцию я бы не стал.

Понятно, что стрелять из пушки по воробьям не стоит. Но в высоконагруженных системах подобная оптимизация может быть очень оправданной.
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 34 _vit  (Гостей: 33)

© 2000-2024 Fox Club 
Яндекс.Метрика