Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.05.2011, 22:26   #11
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

map_data=map_data1;

ну, это меняет значение поинтера но не меняет данных.

поэтому, нужно сделать CopyMemory map_data на вспомогательный буффер, потом CopyMemory map_data1 на map_data и в заключение CopyMemory вспомогательный буффер на map_data1.
f.hump вне форума Ответить с цитированием
Старый 19.05.2011, 03:33   #12
qip2005
Пользователь
 
Регистрация: 14.09.2008
Сообщений: 61
По умолчанию

Спасибо f.hump.
А кто может предложить как прочитать нормально вторую половину файла? Реально уже мыслей нет. Получается что если файл допустим весит 2*64*1024+2=131074 байт , то первую половину считываю без вопросов, т.е. первые 65537 байт, вторая половина начинается 65538 байта, что не кратно гранулярности и я теряю серьёзный кусок инфы. Как можно это решить?
qip2005 вне форума Ответить с цитированием
Старый 19.05.2011, 10:33   #13
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

Цитата:
как прочитать нормально вторую половину файла?
Я думаю стоит честно просчитать ситуацию на бумажке. Для начала хотя бы для приведенного примера (131074 байт). Посмотреть сколько байт откуда, куда и когда копировать, не стесняться использовать указатели. Стоит помнить, что чтение данных проиходит блоками по 64к и только со смещений кратных ганулярности. Еще, думаю, нужно понять, что задача не про то "как прочитать вторую половину файла", а про то как правильно скопировать данные. Когда получится пример, посмотреть, что нужно улучшить/изменить для того чтобы работало в общем случае.
Только так.

Последний раз редактировалось f.hump; 19.05.2011 в 10:40.
f.hump вне форума Ответить с цитированием
Старый 19.05.2011, 11:21   #14
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

мне кажется проще промэпить весь файл и сделать что-то в духе
Код:
for(i=0; i<(filesize/2); i++)
{
   tmp = mapdata[i];
   mapdata[i] = mapdata[filesize-i-1];
   mapdata[filesize-i-1] = tmp;
}
хотя это не то что нужно, это полное инвертирование файла, но смысл тот же. Чтобы поменять части местами то так
Код:
fp = filesize/2+1;// (если размер нечётный, то байт в середине остаётся на месте)
for(i=0; i<(fp); i++)
{
   tmp = mapdata[i];
   mapdata[i] = mapdata[fp+i];
   mapdata[fp+i] = tmp;
}
и к тому лучше если нужна именно оптимизация, то лучше создать один объект файлового мэпинга, чем два.
если вы думаете что копирование цикле это долго, я могу вас успокоить: функции CopyMemory и memcpy копируют память также

Последний раз редактировалось rpy3uH; 19.05.2011 в 11:26.
rpy3uH вне форума Ответить с цитированием
Старый 19.05.2011, 12:01   #15
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

Цитата:
функции CopyMemory и memcpy копируют память также
если я правильно помню, то CopyMemory пользуется REP MOVSB, что определенно быстрее чем цикл.
Плюс ТС говорит о ситуации, когда загрузить весь файл в память невозможно, либо слишком ресурсорсемко.
f.hump вне форума Ответить с цитированием
Старый 20.05.2011, 09:36   #16
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Цитата:
Сообщение от f.hump Посмотреть сообщение
то CopyMemory пользуется REP MOVSB, что определенно быстрее чем цикл.
не всегда быстрее, проверено на личном опыте
rpy3uH вне форума Ответить с цитированием
Старый 20.05.2011, 10:16   #17
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

2 гру3ин

А можно пример, чтобы тоже на личном опыте проверить.
f.hump вне форума Ответить с цитированием
Старый 20.05.2011, 10:33   #18
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

конкретных примеров у меня нет, года три назад при написании лабы по алгоритмизации я хотел похвастаться перед преподом, сделал копирование через ассемблерную вставку через rep movsb, я получил уменьшение скорости. и к тому же всё заивисит от размеров данных и модели процессора.
вот тесты http://www.ezdoum.com/upload/cache/bandwidth.pdf

вообще многие методы оптимизации которые были описаны в старых книгах по асму уже не работают на современных процах. Плюс есть куча дополнительных условий ускоряющих или замедляющих скорость выполнения иструкций, например, наличие искомых данных в кэше и т.д. и т.п. А если программа на С++ то ещё зависит от того что там сгененирует компилятор

Последний раз редактировалось rpy3uH; 20.05.2011 в 10:42.
rpy3uH вне форума Ответить с цитированием
Старый 20.05.2011, 14:58   #19
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

А... Известная тема.
Для тех кто хочет знать подробности читаем это:
http://www.intel.com/Assets/PDF/manual/248966.pdf


Ч:
Заодно сам почитал.
Пишут, что если кто хочет отжать максимум из REP MOVS, для объемов больше 16 байт, имеет смысл выравнивать память по 16-ти байтной границе.

Последний раз редактировалось f.hump; 21.05.2011 в 10:17.
f.hump вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос по mySQL + Вопрос по RichEdit HTL Общие вопросы Delphi 4 01.01.2010 20:22
Вопрос наверное про функции, а так точно даже не знаю про что. (Вопрос начинющего #6) Albert2008 Общие вопросы Delphi 4 21.08.2008 15:33
вопрос по сокетам и общение как в ICQ.Сложный вопрос... Руслантус Общие вопросы C/C++ 2 12.08.2008 21:10
вопрос по С# Roberto Фриланс 1 17.05.2008 08:12
Вопрос Mitron О форуме и сайтах клуба 1 11.02.2008 06:26