2014-10-05 69 views
-2

我正在使用while循环来执行一些算法,什么不是,但它不是很快,我如何让我的程序使用更多的RAM? (我认为这是限制它)它目前稳定在504kB。C++更快的执行

我使用

  • Ç:: B 13.12
  • 64位Windows 7
  • 的mingw32-G ++。exe文件(我不认为我需要的64位版本,除非我想去超过4GB公羊吧?)

我很抱歉,如果这个问题已被问及之前回答,但我似乎无法找到它,如果它。

编辑:所以这将扫描100像素,这是什么导致这需要2.2秒?

#include <windows.h> 
#include <iostream> 
#include <wingdi.h> 
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

using namespace std; 

void scan(HDC dc, int x, int y, int &r, int &g, int &b) { 

    COLORREF color = GetPixel(dc, x, y); 

    r = GetRValue(color); 
    g = GetGValue(color); 
    b = GetBValue(color); 

} 

int main() { 

    HDC dc = GetDC(NULL); 

    int r,g,b; 

    for(int i = 0; i < 100; i++) { 
     scan(dc,100,100 + i,r,g,b); 
    } 

    ReleaseDC(NULL, dc); 

    return 0; 
} 

2:nd edit:是否可以在不编辑代码的情况下减少这段时间?我的意思是,它必须受到我的RAM或我的CPU的限制吗?

+1

对于各种问题,各种各样的有趣的时空权衡,但没有一般的答案。所以提出的问题是没有意义的。 – Xarn 2014-10-05 18:15:17

+3

我在解决数学问题上总是很慢。当我的叔叔给我买了一间更大的房子时,这一切都改变了,现在我只需轻轻一磨就能解决所有问题。 – 2014-10-05 18:16:30

+0

好吧,@KerrekSB,万一你的老房子太小,你甚至无法坐得舒服,那么这可能确实如此。 :D以类似的方式,不断交换到硬盘可能会减慢你的速度,但我怀疑504 kB是否足够。即使回到MS-DOS时代,通过编辑启动文件也可以轻松实现这些操作。 ;) – Mario 2014-10-05 18:19:13

回答

3

您的程序不限于那么少量的内存。由于它很可能被编译为32位应用程序,因此默认情况下它将能够分配高达2 GB的RAM。

所以,不,内存很可能不是你的问题,除非你经常要求并且再次释放它(但是即使这样它依赖于你的代码)。

如果你的程序太慢了,你可能可以使用并行来获得更快的处理速度,但这又取决于你的实际代码。

你也许能够在编译时使用模板和实例来优化你的算法,但是又不知道代码是什么......不。


由于编辑:

的瓶颈是 - 前面已经提到 - 反复调用GetPixel()这本身就是相当昂贵的,因为有工作要做未缓存等

工作

相反,您应该将窗口内容复制到您自己的内存区域并直接读取像素(以字节为单位)。您可以关注this MSDN example。他们正在将位图内容/像素写入文件,但您基本上也希望这样做,只需直接读取数据即可。只需使用变量lpbitmap即可找到相关的行。

总之你要创建BitBlt()截图为位图,然后利用复制的GetDIBits()像素:

// memory dc for the window 
hdcMemDC = CreateCompatibleDC(hdcWindow); 

// bitmap for the screenshot 
hbmScreen = CreateCompatibleBitmap(hdcWindow, rcClient.right-rcClient.left, rcClient.bottom-rcClient.top); 

// connect both  
SelectObject(hdcMemDC,hbmScreen); 

// copy the window contents 
BitBlt(hdcMemDC, 0,0, rcClient.right-rcClient.left, rcClient.bottom-rcClient.top, hdcWindow, 0, 0, SRCCOPY); 

// get the bitmap object 
GetObject(hbmScreen, sizeof(BITMAP), &bmpScreen); 

// access the bitmap 
HANDLE hDIB = GlobalAlloc(GHND,dwBmpSize); 

// lock the bitmap 
char *lpbitmap = (char *)GlobalLock(hDIB); 

// copy the pixel data 
GetDIBits(hdcWindow, hbmScreen, 0, (UINT)bmpScreen.bmHeight, lpbitmap, (BITMAPINFO *)&bi, DIB_RGB_COLORS); 

// now access lpbitmap inside your loop and later on clean up everything 
+0

感谢您的回答,但我不明白还有什么会限制它的执行速度。 – Mandera 2014-10-05 18:26:58

+2

@Mandera向我们展示一些代码或至少命名一些算法(或至少类似的)。一旦你的算法变得复杂或者你的数据足够大,CPU很容易变慢。 – Mario 2014-10-05 18:29:00

+0

我添加了一些代码,希望你能给我一些见识,让我知道我的无知。 – Mandera 2014-10-05 18:37:17

1

问题是GetPixel。这是一个非常缓慢的API。另一种方法是将屏幕复制到内存缓冲区,然后访问内存缓冲区。

+0

好的,但实际上是什么导致它“变慢”,它会是CPU吗? – Mandera 2014-10-05 18:47:38

+0

这将是微软。 – 2014-10-05 21:34:42

+0

因此,无论我有一台蹩脚的15年计算机还是新计算机,总是需要相同的时间? – Mandera 2014-10-06 04:35:01