for flooders
:: Главная :: Решения :: Статьи :: Сайт М. Дроздова :: Файловый архив :: Книга по VFP 9 :: Русский Help Online :: OFF-LINE Форум
   Л и с о в о д ы   в с е х   с т р а н,  о б ъ е д и н я й т е с ь !!!  

Список Форумов  :: Visual Foxpro, Foxpro for DOS
   :: Помощь сайту :: 

Re: Удаление лишних пробелов
Jlutko
Автор

Сообщений: 122
Откуда: Пермская область
Дата: 13.01.18 02:48:43ОтветитьЦитировать
Ну здесь Вы не правы.
Да, есть конкретная трабла... Да, я ее решил в рамках FoxPro...
Но есть понятие "обучение". И мне это интересно!
Ratings: 0 negative/0 positive

Re: Удаление лишних пробелов
Jlutko
Автор

Сообщений: 122
Откуда: Пермская область
Дата: 13.01.18 03:04:17ОтветитьЦитировать
use32    
        
     push ebp    
     mov ebp, esp    
     push edi    
     push esi    
     push eax    
     push ebx    
     push ecx    
     push edx    
     mov esi, [ebp+08h]    
     mov eax, [ebp+0Ch]    
     mov edi, [ebp+10h]    
     mov ebx, [ebp+14h]    
     mov ecx, [ebx]    
     xor ebx, ebx    
        
    m2:    
     cmp al, [esi]    
     je m1    
        
     xor ah, ah    
        
    m5:    
     push dword [esi]    
     pop dword [edi]    
     inc esi    
     inc edi    
     inc ebx    
     dec ecx    
     jne m2    
     jmp m3    
        
    m1:    
     cmp ah, 01    
     je m4    
     inc ah    
     jmp m5    
        
    m4:    
     inc esi    
     dec ecx    
     jne m2    
        
    m3:    
     mov ecx, [ebp+14h]    
     mov [ecx], ebx    
     pop edx    
     pop ecx    
     pop ebx    
     pop eax    
     pop esi    
     pop edi    
     mov esp, ebp    
     pop ebp    
     ret 0010h
Обалдеть!..
Вспоинил свой первый комп... И первый драйвер, что печатал...
РЕСПЕКТ!
Ratings: 0 negative/0 positive

Re: Удаление лишних пробелов
ssa
[Модератор]

Сообщений: 11836
Откуда: Москва
Дата: 13.01.18 10:48:11ОтветитьЦитировать
Igor Korolyov
Естественно это всё имеет чисто спортивный интерес, т.к. для типичных применений - "облагородить" ввод юзером весьма коротких строк-наименований - даже жутко неэффективный "цикл замены двух пробелов на один до достижения результата" вполне себе подойдёт
А вот ни фига и не спортивный, самый что ни на есть практический. Очистка данных перед загрузкой на sql сервер. Даже на моих не слишком больших объемах и то заметно.

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive

Re: Удаление лишних пробелов
Igor Korolyov

Сообщений: 30406
Дата: 13.01.18 11:33:51ОтветитьЦитировать
Смотря каких данных... Если это строки (одно поле) по 100-200 символов с парой-тройкой "больших отступов", то даже чисто фоксовый цикл на 2-3 итерации исполнится этак раз в 10 быстрее чем собственно обращение к серверу для сохранения этой записи. И особо большого смысла в оптимизации я не вижу - при том что для эстетов есть reduce - наверняка не супер-оптимально написанный, но существенно быстрее фоксовой реализации.
Конечно, если это "Война и Мир", то имеет смысл озаботиться оптимизацией ассемблерного кода. И даже распараллеливанием работы, отказом от хранения всего содержимого одновременно в памяти (тем более два раза) и прочими нюансами...


------------------
WBR, Igor
Ratings: 0 negative/0 positive

Re: Удаление лишних пробелов
Jlutko
Автор

Сообщений: 122
Откуда: Пермская область
Дата: 13.01.18 13:12:36ОтветитьЦитировать
Абсолютно согласен!
Речь идет в выгрузке данных в "кликнт-банк" - Вполне осязаямоя задача.
Ratings: 0 negative/0 positive

Re: Удаление лишних пробелов
spinz

Сообщений: 3495
Дата: 13.01.18 13:27:16ОтветитьЦитировать
leonid
Так кто ж мешает то? Заодно бы и сравнили. Может как раз все наоборот.

Ну как-то так, только сам алгоритм, без пролога и эпилога функции. У кого есть желание, переложите это в маш.коды для фокса и запилите тест на мегабайтных строках с длинными последовательностями пробелов и не-пробелов. Мне лень))

  
  ;на входе: в al пробел, ebx адрес начала результирующего буфера,  
  ;ecx длина исходной строки в байтах, edi адрес начала исходной строки  
    
  cld  
    
  repe scasb  
  jz _Exit  
    
  _Loop:  
  mov esi,edi  
    
  repne scasb  
  push ecx  
  mov ecx,edi  
  jz _Label1  
  inc ecx  
    
  _Label1:  
  sub ecx,esi  
  dec esi  
    
  push edi  
  mov edi,ebx  
  rep movsb  
  mov ebx,edi  
  pop edi  
  pop ecx  
    
  jecxz _Exit  
    
  repe scasb  
  jz _Exit  
  mov [ebx],al  
  inc ebx  
  jmp _Loop  
    
  _Exit:



Исправлено: spinz, 13.01.18 13:33
Ratings: 0 negative/0 positive

Re: Удаление лишних пробелов
Simple777

Сообщений: 17572
Дата: 13.01.18 13:53:10ОтветитьЦитировать
Я же говорю - BM, 4 сезон, 1 серия. [sm128]



Исправлено: Simple777, 13.01.18 13:53
Ratings: 0 negative/0 positive

Re: Удаление лишних пробелов
of63

Сообщений: 9779
Откуда: Н.Новгород
Дата: 13.01.18 13:56:12ОтветитьЦитировать
Не знаю, о чем спор (о скорости выполнения? о нужности убирания лишних пробелов?), но бывает, что скорость особо не нужна, тогда решается на фоксе. Если надо побыстрее, то есть SYS(2600) - операции с байтами в памяти. И наконец на ассемблере, может с применением новых команд процессора (например, для управления гиперзвуковыми боеголовками в реальном времени на фоксе на штатовском бытовом проце и ОСи).

Вот тут делали похожее - перестановка байтов в строке forum.foxclub.ru
На всякий приложу заготовку для экспериментов из той ветки от leonid-а же:
Ratings: 0 negative/0 positive

Re: Удаление лишних пробелов
Simple777

Сообщений: 17572
Дата: 13.01.18 14:09:03ОтветитьЦитировать
Насчет ассемблерных вставок "вообще". Если я правильно понял то, что говорит по этому поводу Taran, то ассемблерные вставки в FoxPro - штука не очень надежная, и при интенсивном использовании могут приводить к серьезным глюкам. Что характерно, leonid не стал возражать по этому поводу - то ли ему "влом" возражать, то ли он с этим утверждением согласен.
Ratings: 0 negative/0 positive

Re: Удаление лишних пробелов
of63

Сообщений: 9779
Откуда: Н.Новгород
Дата: 13.01.18 14:12:53ОтветитьЦитировать
Комп вообще ненадежная штука, и ОСь, и фокс, и програмер. Щас например сплошные косяки в космонавтике по причине ПО, потому что много деталей в устройстве, причем если хотя бы одну составляющую не учесть, сломать - ломается весь прибор... Поэтому пиши на фоксе, он надежен, как время показало, а ассемблер - только при необходимости.
Ratings: 0 negative/0 positive

Re: Удаление лишних пробелов
Simple777

Сообщений: 17572
Дата: 13.01.18 14:16:43ОтветитьЦитировать
of63
пиши на фоксе, он надежен

FPD - да, VFP - наврятли. \m/ [sm128]
Ratings: 0 negative/0 positive

Re: Удаление лишних пробелов
spinz

Сообщений: 3495
Дата: 13.01.18 14:44:26ОтветитьЦитировать
Да ничо не надежно. Вот прошьет твой процессор быстрый нейтрон из далекой галактики и всё пропало.
Ratings: 0 negative/0 positive

Re: Удаление лишних пробелов
of63

Сообщений: 9779
Откуда: Н.Новгород
Дата: 13.01.18 14:48:27ОтветитьЦитировать
Меня не подводил. Его ваяли еще те ребята, которые ФПД родили, поверь на слово, по нем видно, что не утратили совместимость с командами (аж с ФПД-1), не утратили дух - простота, не стали делать монстра - не стали навязывать фреймверк навроде дотнета. Все в нем работает.
Ratings: 0 negative/0 positive

Re: Удаление лишних пробелов
Simple777

Сообщений: 17572
Дата: 13.01.18 14:54:30ОтветитьЦитировать
of63
Все в нем работает.

Однако C0000005 его компрометирует. [sm128]
Ratings: 0 negative/0 positive

Re: Удаление лишних пробелов
of63

Сообщений: 9779
Откуда: Н.Новгород
Дата: 13.01.18 15:40:06ОтветитьЦитировать
Давно не видел C..005. Которые были ошибки, те были не с фоксом связанные, а с... сам чего-то накосячил. У самого фокса огрехи есть (не C..005, а баги, фичи), но они известны, и обходятся.

Вот последние ошибки vfp9err.log, не часто, и то - это на машине разработчика.



Исправлено: of63, 13.01.18 15:40
Ratings: 0 negative/0 positive

Re: Удаление лишних пробелов
spinz

Сообщений: 3495
Дата: 13.01.18 17:04:16ОтветитьЦитировать
Запилил таки тест на фоксе - результаты очень близкие.

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

Казалось бы, 10 млн итераций кода
  
  m2:  
  cmp al, [esi]      
  je m1  
  xor ah, ah      
  m5:  
  push dword [esi]  
  pop dword [edi]      
  inc esi      
  inc edi      
  inc ebx      
  dec ecx      
  jne m2

должно быть прилично медленней 10млн итераций выполнения одной команды
  
  rep movsb

Однако нифига не так. Видимо, процессоры настолько быстры, что 10млн это очень мало.Надо будет еще потестить через RDTSC на голой системе без ОС, с более длинными строками.
Ratings: 0 negative/0 positive

Re: Удаление лишних пробелов
Igor Korolyov

Сообщений: 30406
Дата: 13.01.18 17:05:51ОтветитьЦитировать
Simple777
Однако C0000005 его компрометирует.
Если C005 возникает на пустом месте, значит это аппаратная проблема (сбой памяти, процессора, реже - диска или сети). И никакой FPD в таких случаях не будет вести себя "надёжнее". А т.к. сам DOS достаточно хлипкая система, то скорее всего там где VFP "вываливается" по c005, DOS+FPD банально зависнут или "перегрузят" машину.
Программные же ошибки - ну часть из них настолько же серьёзна что повалит и FPD - я правда не в курсе какая именно там возникнет ошибка, но это можно в принципе проверить. "Испорченные" dbf/cdx/fpt файлы - вполне себе могут свалить FPD.
Часть, конечно, возникает за счёт ошибок в подключемых компонентах - ActiveX, ODBC драйвера, всякие разные "левые" dll-ки и fll-ки.
Естественно что поскольку в FPD возможность подключения внешних модулей гораздо более ограничена (но она таки есть!), там меньше шанс поиметь проблему из-за такого "сомнительного" компонента. Но и в VFP зачастую вполне себе можно обойтись без "красоты".
"Подключение" ассемблерных вставок само по себе не является проблемой, и не добавляет никакого риска. Проблемой является лишь написание корректного и безопасного кода для таких вставок - это абсолютно идентично написанию сишных вставок в виде fll для VFP и plb для FPD - если написать их неаккуратно, то можно поиметь кучу проблем.
Замечательная особенность DOS-а, это полное отсутствие разделения между работающими процессами (т.к. система НЕ многозадачная, и любое "параллельное" исполнение задач в ней реализуется весьма и весьма ненадёжными средствами). Т.е. в "настоящей" связке DOS+FPD проблема возникшая в любой подключенной "в фон" (так называемые TSR-задачи), либо же в явно запущенной из FPD программе вызывает крах всей системы. Для VFP запуск внешнего процесса, или же поломка в каком-то фоновом виндовом процессе (если таковая поломка не сломает собственно всю винду, что для современных версий гораздо менее вероятно чем для старинных Win9x) пройдёт совершенно незамеченной. Даже крах вызванной из фокса программы при адекватной обработке (т.е. осознать что оно "не сработало" и, к примеру, брать выходные файлы нельзя) тоже пройдёт незамеченным.


------------------
WBR, Igor
Ratings: 0 negative/0 positive

Re: Удаление лишних пробелов
of63

Сообщений: 9779
Откуда: Н.Новгород
Дата: 13.01.18 17:53:26ОтветитьЦитировать
> 10 млн итераций кода должно быть прилично медленней одной команды rep movsb
Наверное, общее время (количество байтов) должно быть большим, много тиков таймера, чтобы сравнивать. Если скорость памяти 1ГГц = 1000 Млн (слов(?) в сек), то 10 Млн читаются/пишутся за 0.01 с... А сам код проги, из 1 строки, или из 10-100, все равно считывается процом 1 раз, преобразуется в предсказателе, и при частоте выполнения в 2-3 ГГц наверное мало роляет...
Ratings: 0 negative/0 positive

Re: Удаление лишних пробелов
vic7tar

Сообщений: 46
Дата: 13.01.18 18:37:58ОтветитьЦитировать
Всем привет.
А почему бы действительно не использовать родной STRTRAN, или я не по теме?



Исправлено: vic7tar, 13.01.18 18:39
Ratings: 0 negative/0 positive

Re: Удаление лишних пробелов
Simple777

Сообщений: 17572
Дата: 13.01.18 18:45:21ОтветитьЦитировать
Igor Korolyov
в "настоящей" связке DOS+FPD проблема возникшая в любой подключенной "в фон" (так называемые TSR-задачи), либо же в явно запущенной из FPD программе вызывает крах всей системы.

Дак никто не спорит, что связка DOS+FPD хуже, нежели WIN+FPD. Какой бы ни была устаревшей DOS, с каждой новой версией Windows среда псевдо-DOS таки улучшалась. Иными словами, в скрытой форме MS-DOS таки существовала и развивалась. Что же касаемо критических ошибок в FPD. Бывают, но крайне редко это бывает "по неизвестной причине". Да и по известным причинам это бывает очень редко. Встерал пару раз, быть может, когда система вешалась из-за испорченных таблиц или индексов, но и в этом случае какое-то сообщение выдавалось типа: Invalid buffpoint call. И если в FPD и возникают критические ошибки, то в подавляющем большинстве случаев они воспроизводимы, и можно точно увидеть команду, на которой система вешается. Думается, что в VFP ситуация с критическими ошибками не такая прозрачная.
Ratings: 0 negative/0 positive



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

On-line: 47 Simple777 GM51 vnkor  and Guests: 44


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