Автор | Сообщение |
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 11.12.05 22:24. Заголовок: Проблема с COPY TO в Clipper 5.2
Обнаружил, что COPY TO работает в 87(!) раз медленнее, чем в Clipper 5.01! Специально проверял по SECONDS()... Заменил на цикл DO с копированием каждой записи отдельно с использованием FIELDGET() и FIELDPUT() - процесс пошёл быстрее в 3 раза! И всё равно по сравнению с 5.01 получается в 30 раз дольше... Закрыть DBF, скопировать как файл и открыть снова не потянет - работа идёт в сети. Думал, дело в CDX. Отключил перед копированием (close indexes) - ничего не изменилось... Кто-нибудь ещё с такой проблемой сталкивался?
|
|
|
Ответов - 14
[только новые]
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 11.12.05 22:38. Заголовок: Re:
Лукашевский Оба EXE собирал в PM моде или REAL ? Примерчик покажи. Проверю у себя ;) Что за размер базы ?
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 12.12.05 13:24. Заголовок: Dima
Ну 5.01 понятно что REAL, а 5.2 действительно PROTECTED. Но фишка оказалась не в этом, а в DOSIDLE() от GLASSMANа. Как только её заремил, процесс возвратился к своей обычной скорости. Мой пример: COPY TO ("ARCHIVE\" + Bases) for !DELETED() .AND.NEXTKEY()#K_ESC Можно с тем же успехом убирать NEXTKEY(), но хочется иметь возможность прерывания процесса по инициативе пользователя... да и NEXTKEY() в такой вариации не один раз встречается. А DOSIDLE() убрать, так в XP-NT проблемы начинаются... Для Clipper 5.01 я пользовался PATCHA.EXE CLIP2F, а с 5.2 что-то не срослось, и я вынужден был поставить DOSIDLE(). Может, кто-нибудь знает вариант получше?
|
|
|
|
| постоянный участник
|
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 12.12.05 14:29. Заголовок: Re:
У меня кстати в Клиппер 5.3 при использовании DOSIDLE в ХР эффекта нет. Процессор грузит на все 100, другим программам работать не дает при этом Excel страничку несколько минут грузит и выводит на печать
|
|
|
|
| постоянный участник
|
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 12.12.05 16:52. Заголовок: Re:
Лукашевский пишет: цитата Но фишка оказалась не в этом, а в DOSIDLE() от GLASSMANа. Как только её заремил, процесс возвратился к своей обычной скорости. Мой пример: COPY TO ("ARCHIVE\" + Bases) for !DELETED() .AND.NEXTKEY()#K_ESC
Говорилось много раз. Если комп быстрый, то функции обработки клавиатуры сначала происходят очень часто. Винда думает - комп ничего не делает, дай-ка я в 10 раз понижу приоритет задачи. И задача начинает работать ооооооооооооооооочень медленно. До тех пор, пока ты не прекратишь давать ей сигналы "я ничего не делаю" или до тех пор, пока ты не нажмешь что-нибудь на клавиатуре. Можешь проверить - при нажатом Alt-е копирование будет идти быстро. Проблема решается или временным запрещением (на время работы copy) вызовов разгрузки системы или считыванием клавиатуры не чаще, чем два раза в секунду. В последнем случае иногда возможно отставание часов на XP/NT в дос-сессии
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 12.12.05 22:07. Заголовок: suv2:
Замечательно! Я с удовольствием последую совету, если подскажешь, какой функцией можно временно запретить вызовы разгрузки системы! А то DOSIDLE() как один раз вызван, так и всё - возможности его выгрузки или запрета я, например, не знаю...
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 12.12.05 22:39. Заголовок: Re:
Vlad04 пишет: цитата У меня кстати в Клиппер 5.3 при использовании DOSIDLE в ХР эффекта нет. Процессор грузит на все 100, другим программам работать не дает при этом Excel страничку несколько минут грузит и выводит на печать
Вполне может быть несколько DOSIDLE-модулей, написанных в разное время разными людьми... Этот модуль я выбрал, отбраковав FT_IAMIDLE() и вроде ещё один DOSIDLE(), которые действительно почену-то не работали (по крайней мере в PROTECTED MODE). Тот, что я сейчас использую, снижает загрузку проца на XP до 4 процентов. Могу прислать.
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 13.12.05 11:46. Заголовок: Re:
Это так , для информации.. Лукашевский пишет: цитата Обнаружил, что COPY TO работает в 87(!) раз медленнее, чем в Clipper 5.01!
Кстати подобная ситуация была и с хХарбором под ХР. Сейчас реализация команды COPY TO изменена и если ставишь команду SET HARDCOMMIT OFF то работает быстро.
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 14.12.05 05:52. Заголовок: Re:
MMK: С причиной в 5.2 уже разобрались: DOSIDLE() вместе с NEXTKEY(), а если отключить DOSIDLE(), то в Xрюше проблем, но работает почти так же быстро, как в 5.01 (ну, может процентов на 10-15 медленнее - это уже ерунда) А вот как КОНКРЕТНО это дело обойти, SUV2 нас ещё не просветил, хотя теорию изложил популярно...
|
|
|
|
| постоянный участник
|
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 14.12.05 15:20. Заголовок: Re:
Лукашевский пишет: цитата Замечательно! Я с удовольствием последую совету, если подскажешь, какой функцией можно временно запретить вызовы разгрузки системы! А то DOSIDLE() как один раз вызван, так и всё - возможности его выгрузки или запрета я, например, не знаю...
Я не использую твою библиотеку разгрузки, у меня своя, самописная. И в отдельном виде она не существует, т.к. она встроена в моё личное переделанное клипперное ядро. Там я могу отключать-включать разгрузку на лету. Тебе в таком случае надо воспользоваться вторым вариантом - считывать кнопки не чаще 2 раз в секунду. Но чтобы это сделать, тебе придется использовать seconds(), который СИЛЬНО (очень!!!! очень сильно) тормозит систему :-))) И выигрыш по скорости ты вряд ли получишь, если будешь использовать стандартный seconds(). А как считывать в WinXP время, чтобы система не тормозила - это отдельная сложная тема, она на форуме обсуждалась. Можно еще попробовать ковырнуть твою библиотеку, чтобы добавить возможность запрещения-разрешения. Или попытаться изготовить отдельную библу. Быть может, в твоей библе есть спец-функция, которая один раз делает разгрузку. Т.е. не в автомате типа installIdle() (и разгрузочные вызовы происходят автоматом при inkey()), а вручную типа IAmIdleNow(). Тогда надо использовать второй вариант и вызывать разгрузку только тогда, когда надо.
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 17.12.05 03:25. Заголовок: Re:
suv2 пишет: цитата Быть может, в твоей библе есть спец-функция, которая один раз делает разгрузку. Т.е. не в автомате типа installIdle() (и разгрузочные вызовы происходят автоматом при inkey()), а вручную типа IAmIdleNow(). Тогда надо использовать второй вариант и вызывать разгрузку только тогда, когда надо.
Когда-то что-то такое я сделать пытался, но выяснилось, что "типа IAmIdleNow()" нужно задействовать не только для INKEY(), но и для MENU TO, и не факт, что сей список не продолжится...
|
|
|
|
| постоянный участник
|
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 19.12.05 12:53. Заголовок: Re:
Menu to, read, achoice... - первые две - на клиппер и декомпилируются, можешь внести исправления сам. Achoice на ассемблере, потому перепиши её на tbrowse и вставляй туда IAmIdleNow(). Или шли библу
|
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 25.12.05 03:31. Заголовок: SUV2:
Я сделал проще - связался с Дмитрием Стекленевым, он сделал возможность выгрузки DOSIDLE(.F.) Сейчас пробую. Вроде работает. Наверное, обновление скоро появится на его сайте.
|
|
|
|
| постоянный участник
|
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 26.12.05 10:40. Заголовок: Re:
Что за сайт?
|
|
|
|
| модератор
|
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 26.12.05 12:48. Заголовок: Re:
|
|
|
|