我正在使用“内存扫描器”,但是扫描速度很慢。有人可以帮助我改进它吗?

procedure FirstScan(scantype, scanvalue: string);
var
 value :integer;
 dwEndAddr : dword;
 i:dword;
 mbi : TMemoryBasicInformation;
begin
  while (VirtualQuery(Pointer(DWORD(mbi.BaseAddress) + MBI.RegionSize), MBI, SizeOf(MEMORY_BASIC_INFORMATION))=SizeOf(TMemoryBasicInformation)) do begin
   if (MBI.State = MEM_COMMIT) and (MBI.Protect = PAGE_READWRITE) then begin
    dwEndAddr := DWORD(mbi.BaseAddress) + MBI.RegionSize;
     for i := DWORD(MBI.BaseAddress) to (dwEndAddr - 1 - sizeof(DWORD)) do begin
      Application.ProcessMessages;
      try
       if scantype = '1 Byte' then begin
        value := PBYTE(i)^;
        if scanvalue = IntToStr(value) then ListBox1.Items.Add(IntToHex(i,8));
       end;
       //others scantypes here...
      except
       Break;
      end;
     end;
   end;
  end;
end;

我了解到我需要一次读取4096字节的页面,然后将它们存储在内存中并对其进行操作,直到需要新页面,然后再获得另一个4096字节的页面...

但是我不知道该怎么办...

有谁能够帮助我?代码可以是C或C++ ...

最佳答案

为了快速执行慢速代码,您可以做一些事情。首先,请确保您的代码正确。错误的结果仍然是错误的结果,即使您很快就能得到它们。为此,请确保在调用VirtualQuery时,正在传递所有参数的有效值。在此函数的开始处,mbi尚未初始化,因此DWORD(mbi.BaseAddress) + MBI.RegionSize的结果将是who-knows-what。

正确使用代码后,有两种方法可以使其更快:

  • 找到较慢的部分并使它们变快。为此,您需要一个探查器。探查器将在程序运行时对其进行观察,然后告诉您程序执行每个部分所花费的时间百分比。这告诉您应该在哪里集中精力。
  • 用较快的算法替换较慢的算法。这可能意味着丢弃整个函数,或者可能意味着仅修复代码的某些部分。

  • 例如,分析可能表明您花费大量时间调用ProcessMessages。由于它是VCL的一部分,因此您无法真正使其更快地实现,但是您可以减少调用它的频率。如果运行该代码的线程不希望接收任何需要处理的消息,您甚至可能根本不需要调用它。

    分析可能表明您花费大量时间进行字符串比较。如果字符串的开头经常相等,并且通常仅在结尾处不同,那么您可能希望更改字符串比较算法,以比较最后一个字符而不是第一个字符开始比较字符串。

    分析可能表明在比较整数之前,您花费了大量时间将整数转换为字符串。大多数编程语言都支持直接比较整数,因此您可以尝试使用整数比较算法,而不是使用字符串比较算法。您可以使用scanvalueStrToInt(scanvalue)转换为整数,然后将其直接与value进行比较。

    分析可能表明您正在从相同的输入重复计算相同的结果。如果某个程序的某个部分的值没有变化,则从该值计算出的值也不会变化。您可以通过仅在值更改后执行转换来降低转换成本。例如,如果您进行整数比较,则可能会发现scanvalue的整数版本在函数中没有改变。您可以在函数开始时将scanvalue转换为整数一次,然后将value与循环内的StrToInt(scanvalue)进行比较,而无需多次调用ojit_code。

    10-07 19:11