2017-02-17 7 views
-2

В C++ я использую ReadProcessMemory для получения значений некоторых чисел. Каждое из чисел находится в тандеме, и есть пять разных чисел. Быстрее ли выполнять пять одиночных вызовов RPM для чтения каждого номера в отдельности или ускорить выполнение одного вызова RPM, который считывает всю структуру, созданную для размещения этих пяти номеров? Например,Что происходит быстрее: несколько небольших RPM или RPC одиночной структуры

Mem.Read<int>(DWORD64 L1); 
Mem.Read<int>(DWORD64 L1); 
Mem.Read<int>(DWORD64 L1); 
Mem.Read<int>(DWORD64 L1); 
Mem.Read<int>(DWORD64 L1); 

или

struct numbers{ 
    int a; 
    int b; 
    int c; 
    int d; 
    int e; 
    }; 
Mem.Read<numbers>(DWORD64 L1) 

Спасибо!

+0

Если вам нужно забрать 5 пачек молока в магазине, было бы быстрее бежать туда 5 раз и носить один дом каждый, или забрать все 5 и путешествовать только один раз? Если вы должны спросить, вы, вероятно, не должны называть 'ReadProcessMemory' для начала. – IInspectable

+0

странный вопрос. конечно, в этом случае одиночный вызов 'ReadProcessMemory' будет в 5 раз быстрее, чем 5 звонков – RbMm

+0

Вопрос был плохо сформулирован. Я хотел сказать, лучше ли делать очень большое чтение структуры или отдельных вызовов RPM? Например, что, если моя структура была размером в несколько тысяч бит .... – anon6588

ответ

0

Использование ReadProcessMemory для чтения памяти является «медленным», поэтому одна большая операция будет быстрее, чем многие маленькие чтения.

Если мы игнорируем тот факт, что ReadProcessMemory, вероятно, является системным вызовом, который должен выполнить контекстный переход в режим ядра и получить доступ к страницам другого процесса (который может быть выгружен и т. Д.), Вы все же можете сделать предположения о скорость одного большого против большого количества маленьких чтений.

Представьте, что вы читаете из своего собственного процесса. Многие вызовы memcpy с небольшим буфером медленнее, чем одна большая операция копирования. Просто вызов функции имеет некоторые накладные расходы; команда вызова, настройка стека, выполнение фактической работы, а затем восстановление стека и возврат. Типичная реализация memcpy часто оптимизирована для больших чтений и будет делать небольшую дополнительную работу, чтобы выравнивать исходный адрес, чтобы он мог читать большую часть памяти в 4 или 8 байтовых блоках (возможно, даже больше на новых процессорах).

Я бы сказал, что вам нужно измерить таймер, если вы не уверены в производительности, но в этом случае это не проблема, просто выполните одно чтение.

Смежные вопросы