Как я намеренно читаю из оперативной памяти по сравнению с кэшем?

Если список соединений создал такие имена, как IREG3_0_, IREG3_1_, ... IREG3_31_, нет способа создать циклические операторы, обращающиеся к части _ NNN _. Вы могли бы также использовать IREG3_dog_, IREG3_milk_, ... чтобы назвать свои индексы.

Вам нужно получить список соединений, чтобы сохранить массив экземпляров, чтобы вы могли обращаться к ним как к вложенному циклу. Или вам может понадобиться написать список соединений вручную.

5
задан Erick Robertson 28 September 2012 в 12:11
поделиться

1 ответ

Читать из кэша. имейте цикл, который читает из того же (или очень похожий) адрес памяти:

  • В первый раз, когда Вы читаете из того адреса, значения от того адреса памяти (и от другого, соседнего адреса памяти) будут перемещены в кэш
  • В следующий раз, когда Вы читаете из того же самого адреса, значения уже кэшируются и таким образом, Вы читаете из кэша.

Для чтения некэшируемой памяти имейте цикл, который читает от многих, очень отличающихся (т.е. далее независимо, чем размер кэша) адреса памяти.


Отвечать на Ваш второй вопрос:

  • Вещи, которые Вы делаете с ecx и взглядом jnz хорошо (я не знаю, насколько точный/чувствительный Ваш таймер, но Вы могли бы хотеть циклично выполниться больше чем 100 раз),

  • mov eax, eax не "память чтения"... это не, который перемещает eax в eax. Вместо этого я думаю, что синтаксис MASM для чтения из памяти - что-то больше как mov eax,[esi] ("читают из ячейки памяти, адрес которой содержится в esi")

  • В зависимости от того, какой O/S Вы используете, необходимо читать из адреса памяти, который на самом деле существует и читаем. В Windows, например, приложению не позволили бы сделать mov esi, 0 сопровождаемый mov eax, [esi] потому что приложению не позволяют считать память, адрес/местоположение которой является нулем.


Отвечать на Ваш третий вопрос:

timeGetTime, GetTickCount и Счетчик производительности

Ваше упоминание timeGetTime, GetTickCount и Счетчик производительности подразумевают, что Вы работаете в соответствии с Windows.

Да, они возвращают текущее время к различным разрешениям/точности: например, GetTickCount имеет разрешение приблизительно 50 мс, таким образом, он перестал работать к событиям времени, которые длятся меньше чем 50 мс, неточно при синхронизации событий, которые длятся только 50-100 мс. Вот почему я сказал это 100 в Вашем ecx вероятно, не является достаточно большим.

QueryPerformanceCounter функция является, вероятно, самым точным таймером, который Вы имеете.

Использовать любой из этих таймеров как таймер интервала:

  • Получите время, прежде чем Вы начнете циклично выполняться
  • Получите время снова после окончания цикличного выполнения
  • Вычтите эти два раза: различием является временной интервал

это в порядке, если я даю различные "mov" инструкции?

Да я думаю так. Я думаю, что можно сделать это как это (остерегайтесь, я не уверен/, помнят, является ли это правильным синтаксисом MASM для чтения из ячейки памяти имени)...

mov eax,[memory1]
mov eax,[memory2]
mov eax,[memory3]
mov eax,[memory4]
mov eax,[memory5]

... где memory1 через memory5 адреса широко расставленных глобальных переменных в Вашем сегменте данных.

Или, Вы могли сделать...

mov eax,[esi]
add esi,edx
mov eax,[esi]
add esi,edx
mov eax,[esi]
add esi,edx
mov eax,[esi]
add esi,edx
mov eax,[esi]

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

7
ответ дан 14 December 2019 в 09:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: