Re: Удаление лишних пробелов | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Я про это и говорил - "укрупнять" единицу обработки, но... Там же алгоритм сразу бахнет на порядок по сложности. "Пара" то может аккурат на границе 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 |
Re: Удаление лишних пробелов | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
"Как удалить пробелы" написано в первых 3 сообщениях. Ничего нового в "вариациях" самых разных нагромождений STRTRAN-ов лично я не вижу. Ну кроме очевидных ошибок для "непредусмотренных" случаев. Конкретно по твоему - кто сказал что в строке не будет CHR(0), и что если он там будет его МОЖНО удалять? Твоя спекуляция/додумывание над условиями задачи... В условии, кстати, не оговорён и максимальный размер "строки" - если это данные в мемо-поле, то там запросто поместится почти 2Гб буковок. ------------------ WBR, Igor |
Re: Удаление лишних пробелов | |
---|---|
Taran Сообщений: 13625 Откуда: Красноярск Дата регистрации: 16.01.2008 |
|
Re: Удаление лишних пробелов | |
---|---|
Taran Сообщений: 13625 Откуда: Красноярск Дата регистрации: 16.01.2008 |
Фоксисты живые и не ленивые.
Проверьте идею на приблизительно реальных данных. Разложить строку в массив и собрать обратно. Разделитель - естественно пробел. Опции помнится есть чтоб отбросить ведущие пробелы и пустые элементы. Сам бы сделал - не на чем. P.s. не плохо бы чтобы это сделал топикстартер. Первую мою идею и эту сравнил по времени и ... Исправлено 1 раз(а). Последнее : Taran, 14.01.18 07:16 |
Re: Удаление лишних пробелов | |
---|---|
Simple777 Сообщений: 33855 Дата регистрации: 05.11.2006 |
Ой, да ладна. В свое время я таки довольно подробно изучал MS-DOS, и даже был единственным одмином на немаленьком предприятии, когда еще не было доступа к инету. И всё работало и ремонтировалось - отмазки железячников или продавцов компов не канали. Так что не надо ля-ля. Что же касаемо работы FPD из-под "чистого" DOS и из-под NTVDM. В свое время сравнивал работу приложений FPD и в одном, и в другом случае, проверяя на скорость работы в самых ресурсоемких режимах типа "Индексирование всех массивов" или фильтрующего индекса по условию через AT(). Разница в скорости была более чем заметна, когда речь шла о выполнении приложения из-под NTVDM. |
Re: Удаление лишних пробелов | |
---|---|
Taran Сообщений: 13625 Откуда: Красноярск Дата регистрации: 16.01.2008 |
И чуток про фокс. (Если можно конечно, и асмофилы будут не против?)
Вероятно в некоторых ситуациях мой первый пример с циклом нужно предварить след.
Исправлено 1 раз(а). Последнее : Taran, 14.01.18 09:37 |
Re: Удаление лишних пробелов | |
---|---|
spinz Сообщений: 5263 Дата регистрации: 21.01.2016 |
Но нечитабельно же совершенно. |
Re: Удаление лишних пробелов | |
---|---|
Taran Сообщений: 13625 Откуда: Красноярск Дата регистрации: 16.01.2008 |
Чего там читать то. Ты прям машинные коды все помнишь? Кроме 0х90. Ну и короткий jamp вероятно. Тут же речь не про читабельность, а за скорость. Да и читабельность. Или страница chr'ов или пара строк в hex строке. |
Re: Удаление лишних пробелов | |
---|---|
spinz Сообщений: 5263 Дата регистрации: 21.01.2016 |
Да нет конечно, я совсем про другое. В такой сплошной строчке найти опечатку сложней. |
Re: Удаление лишних пробелов | |
---|---|
spinz Сообщений: 5263 Дата регистрации: 21.01.2016 |
Млять, долбаный каспер! После небольшой модификации алго, он результирующий экзешник стал считать трипером и сразу удаляет его с диска.
Интересно, это у него сигнатуры или эвристика срабатывает. |
Re: Удаление лишних пробелов | |
---|---|
Taran Сообщений: 13625 Откуда: Красноярск Дата регистрации: 16.01.2008 |
Ну это нормально. Вообще асм это конечно песня для программиста. В начале 90х увлекался. Прмню казус. Делаю "мощную" софтину в 56 байт. Естественно .com. Пароль из биоса прочитать. (В то время это было возмозможно). Запускаю. Мои 56 байт превращаются в 2кб. Мозг сломал, пока кто-то не возопил про вирус на машине. |
Re: Удаление лишних пробелов | |
---|---|
spinz Сообщений: 5263 Дата регистрации: 21.01.2016 |
А смысл? Он же шифрованный. Я делал по-другому. В те времена на любой машине был досовский отладчик debug.com. Вот в нем я набирал несколько строчек для обнуления CMOS-памяти (порты 70 и 71) и вуаля, пароля больше нет. |
Re: Удаление лишних пробелов | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Даже в сравнении с имеющимся в foxtools reduce гарантировано проиграет, и смысл тогда? Можно, и даже без IF-ов. По логике если уж и делать "разноурезание" то степенями двойки ходить, а не 100/10. Впрочем я ещё раз замечу - принципиальной разницы между любого вида нагромождением strtran-ов нет. Гигантская строка - и всё, привет. А если плёвое 100-символьное поле, то и смысла изгаляться нет. ------------------ WBR, Igor |
Re: Удаление лишних пробелов | |
---|---|
spinz Сообщений: 5263 Дата регистрации: 21.01.2016 |
Не, SCASW это не то, никакого прироста. Да его по сути и не могла быть, это я тупанул. Мой алгос же тупо ищет непрерывные последовательности непробельных символов и копирует их в результирующий буфер, вставляя между ними пробел. Поэтому поиск двойных пробелов тут не роляет.
Возникла другая мысль, предварительно "разогревать" кэш. Т.е. работать с небольшими блоками, скажем 512к, которые гарантированно умещаются в L2 кэш современных процов. Сперва пробегаемся по такому блоку, читая по одному байту, с шагом 64 байта (т.к. линейка кэша именно 64). Таким образом все 512к окажутся в кэше. А потом уже ищем нужные последовательности. |
Re: Удаление лишних пробелов | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Потому что с тем же диском работал не NTVDM (как обычное win32 приложение, он не может напрямую с железом работать - да и "эмулируемым" прогам этого не позволит), ну и не убогий 16-битный DOS, а б-гомерзкий Windows через свои проклятые API функции, которые так и норовят свалить VFP в с005 ------------------ WBR, Igor |
Re: Удаление лишних пробелов | |
---|---|
Taran Сообщений: 13625 Откуда: Красноярск Дата регистрации: 16.01.2008 |
В начале IBM изации пароль был открыт. А про debug именно я и имел в виду. В нем и создавал первые "шедевры". |
Re: Удаление лишних пробелов | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Полагаю что для любого процессора старше первых пней (там L2 и не было - по крайней мере на чипе или в картридже как для P2) это лишь навредит. Процессор и сам занимается упреждающим чтением и даже спекулятивным исполнением команд (нагружает конвейер). Не надо ему мешать. Мануалы вообще советуют писать как можно более простой и очевидный код, безо всяких "изысков". Кстати, проверять все ваши примеры следует со стороны фокса, а не внутри ассемблерного кода. Т.к. вы по любому используете копирование строки для осуществления этого самого вызова - а при использовании того же FoxAPI копирования можно избежать. По крайней мере двойного. И не прямым запросом RDTSC, который на многоядерных системах может "чудить". msdn.microsoft.com ------------------ WBR, Igor |
Re: Удаление лишних пробелов | |
---|---|
spinz Сообщений: 5263 Дата регистрации: 21.01.2016 |
Так оно, однако тем не менее интеловцы запилили команду PREFETCHx именно для упреждающего чтения в кэш. И я встречал немало примеров, иллюстрирующих значительный прирост скорости при использовании этой инструкции. |
Re: Удаление лишних пробелов | |
---|---|
Taran Сообщений: 13625 Откуда: Красноярск Дата регистрации: 16.01.2008 |
Про foxtools речи нет. Речь о чистом фоксе. Ифы для исключения лишнего создания копии переменной. Вдруг ... Степени двойки .... вероятно. Но как оно конкретно в фоксе. Возможно это просто треп. Гигантская строка это сколько и откуда она. А вот очистить банальное ФИО от лишних пробелов или текст из вне пару-десяток страниц. Вполне вероятно эти маленькие и простые команды помогут. А вот городить вставку на ассемблере без анализа потерь на каждую окружающую операцию я бы не стал. Данные взять, преобразовать, сохранить. Какова ожидаемая доля экономии при вставке маш.кодов? И.... цена сопровождения. |
Re: Удаление лишних пробелов | |
---|---|
spinz Сообщений: 5263 Дата регистрации: 21.01.2016 |
Понятно, что стрелять из пушки по воробьям не стоит. Но в высоконагруженных системах подобная оптимизация может быть очень оправданной. |
© 2000-2024 Fox Club  |