Сейчас на форуме: vasilevradislav, rmn, Magister Yoda (+7 невидимых) |
![]() |
eXeL@B —› Программирование —› Скрытие тяжёлых вычислений |
Посл.ответ | Сообщение |
|
Создано: 08 июля 2008 08:49 · Поправил: Freecod · Личное сообщение · #1 Есть алго, ищет строчку в куче файлов. К поиску в принципе претензий нет, всё работает, но нужно в фоне, а он кушает от процессора много %. Мне бы 1-2% и всё, да и оптимизировать это дело... Принцип: * Находим файл ---- * Открываем * ReadFile на размер буфера * Ищем в буфере * Если в буфер попал весь файл - выход. Если нет - 2 шага назад Собственно пихаю ожидание перед чтением очередной порции, WaitofSingleObject(10), но судя по всему он успевает разогнаться на % на стадии парсинга буфера. Собственно не поделитесь примерами макс. оптимизированного открытия \ чтения файла и может есть какие-то другие "фишки" тихой, но быстрой работы? ![]() |
|
Создано: 08 июля 2008 09:43 · Личное сообщение · #2 |
|
Создано: 08 июля 2008 09:52 · Личное сообщение · #3 [wl] пишет: создавай отдельный поток, ставь ему приоритет чуть выше Idle, и он пускай делает всю работу тогда задача будет выполнятся в фоне используя все свободные ресурсы, а если я правильно понял автора то нужно что бы задача сама по себе ела мало ресурсов, не создавая нагрузки на процессор (видимо что бы не палится ![]() Freecod если процессор разгоняется на парсинге то делай минимальный sleep внутри цикла парсинга ![]() |
|
Создано: 08 июля 2008 10:01 · Личное сообщение · #4 |
|
Создано: 08 июля 2008 10:09 · Поправил: Freecod · Личное сообщение · #5 |
|
Создано: 08 июля 2008 10:56 · Поправил: LazzY · Личное сообщение · #6 ну дык http://msdn.microsoft.com/en-us/library/aa366761.aspx три последних параметра заюзайте и будем вам мапинг по частям.. правда можно мапить только выровненными кусками( ps: у меня параноя, или http://www.exelab.ru/f/action=vthread&forum=6&topic=11933& page=0 дубль ![]() ![]() |
|
Создано: 08 июля 2008 11:30 · Личное сообщение · #7 |
|
Создано: 08 июля 2008 17:01 · Личное сообщение · #8 |
|
Создано: 08 июля 2008 23:21 · Личное сообщение · #9 |
|
Создано: 09 июля 2008 00:16 · Личное сообщение · #10 |
|
Создано: 09 июля 2008 00:18 · Личное сообщение · #11 Что-то вообще никак, даж мсдн не помогает. Ладно, если файл меньше буфера - ставлю в качестве размера считываемых байт всю его длинну. Читает. Но если больше! Делаю - pMemory = MapViewOfFile(hMapFile,FILE_MAP_READ,0, allpos, sizebuf); // allpos - текущая позиция по файлу, sizebuf - кол-во чит. байт. Первый раз - allpos = 0 читает, всё ок. Второй - allpos сдвинулся - снова облом. Если верить мсдн - allpos должен быть выровнен. Но я же читаю сплошной массив байт, что, если искомая строка оказалась разрезанна границей? Приходиться при близости конца при встрече символов, с которых может начинаться строка, оставлять а потом открывать с этого же места. Есть идеи? ![]() |
|
Создано: 09 июля 2008 01:02 · Личное сообщение · #12 drin пишет: тогда задача будет выполнятся в фоне используя все свободные ресурсы Отдельный поток сам по себе не может сожрать много ресурсов ну если это тольео не EBFE, а с низким приоритетом так вообще будет незаметно. Freecod есть такая прога Search&Replace (залил сюда uploaded.to/?id=f10o2t), я был поражен когда задал ей искать строки в папке с игрой. Мало того что она единственная нашла эти строки (даже WinHex в указанном файле не нашел ни в одной кодировке), так еще файл размером в 14 мб она просканила за доли секунды. Посмотри как там реализовано. ----- Yann Tiersen best and do not fuck ![]() |
|
Создано: 09 июля 2008 02:33 · Личное сообщение · #13 |
|
Создано: 09 июля 2008 07:18 · Личное сообщение · #14 PE_Kill пишет: Отдельный поток сам по себе не может сожрать много ресурсов ну если это тольео не EBFE, а с низким приоритетом так вообще будет незаметно. Эта, если в любом потоке сделать "for (;;) ;" (или что-то что ест проц в мелком цикле), то CPU usage мгновенно вырастет до 100%. В случае с низким приоритетом просто OS отдаст процессорное время любому другому потоку и, следовательно, не будет видимых тормозов. (если scheduler работает правильно). Так что, что бы не было пиков в графе CPU usage, не надо кушать сей ресурс. Sleep(). ![]() |
|
Создано: 09 июля 2008 08:01 · Поправил: drin · Личное сообщение · #15 Freecod кстати, можно попробовать упростить задачу контроля исползования цыклов CPU - всю работу делать в отдельном потоке, а в основном или другом его останавливать/запускать, вот тебе элементарный пример который ест ровно 2% CPU, правда боюсь с тяжолой работой будет не все так четко но в пределах удержится, в данном случае можно уменьшить кратность слипов (1/49) для большей "гладкости" но и накладных расходов будет больше и наоборот увеличив кратность, например (10/490), будут скачки маленькие но зато накладных расходов на остановку/запуск а так же сон внутри контрлирующего потока будет значительно меньше
![]() |
|
Создано: 10 июля 2008 22:25 · Личное сообщение · #16 |
|
Создано: 10 июля 2008 23:38 · Личное сообщение · #17 Freecod, в последних версиях SDK есть компилер (ессно из VS). Либы могут не подойти... Формат debug info изменился, хотя сами .obj, которые в .lib, должны быть обычными... Вот headers. Кста, замучаешься исправлять все #includes... Какие либы нужны? ![]() ![]() |
|
Создано: 11 июля 2008 00:32 · Личное сообщение · #18 |
|
Создано: 11 июля 2008 01:02 · Личное сообщение · #19 |
|
Создано: 11 июля 2008 01:03 · Личное сообщение · #20 |
|
Создано: 11 июля 2008 01:14 · Личное сообщение · #21 |
|
Создано: 11 июля 2008 01:49 · Личное сообщение · #22 Недеюсь модеры не будут против, если я сюда все текущие проблемы солью =) Хочу вызывать функцию из z.asm. У меня VC6, так что добавил файл, в настройках настроил компиляцию (С:\masm32\bin\ml.exe /c /coff /nologo $(InputPath) \ .\$(InputName).obj) В z.asm поправил - вместо start: .code PUBLIC _cleanoff _cleanoff PROC NEAR Файл собирается в объектник без проблем. Теперь хочу вызвать его из x.cpp В шапке extern "C" void cleanoff (); вызов cleanoff(); При линковке x.obj x.obj : error LNK2001: unresolved external symbol _cleanoff Release/x.exe : fatal error LNK1120: 1 unresolved externals Что делаю не так? ![]() |
|
Создано: 11 июля 2008 03:32 · Личное сообщение · #23 |
|
Создано: 11 июля 2008 07:40 · Поправил: s0larian · Личное сообщение · #24 |
|
Создано: 12 июля 2008 00:53 · Поправил: Freecod · Личное сообщение · #25 |
|
Создано: 12 июля 2008 10:20 · Личное сообщение · #26 |
|
Создано: 12 июля 2008 23:51 · Поправил: 4kusNick · Личное сообщение · #27 ну дык опция линкера /OPT:REF отрубает все ссылки на NETAPI32.dll, ибо OPT - оптимизация REF - по ссылкам вкури msdn.microsoft.com/en-us/library/bxwfs976(VS.80).aspx на всяк случай... там кста еще написано, что: The /OPT:REF option disables incremental linking ----- Флэш, ява, дотнет - на завтрак, обед и ужин. Unity3D на закуску. ![]() |
![]() |
eXeL@B —› Программирование —› Скрытие тяжёлых вычислений |