C ++执行速度更快

时间:2014-10-05 18:13:57

标签: c++ ram

我正在使用while循环来执行某些算法而不是,但它不是很快,我怎么能让我的程序使用更多的RAM? (我假设它是限制它的)它目前稳定在504kB。

我正在使用

  • C :: B 13.12
  • Windows 7 64位
  • 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:编辑:是否可以在不编辑代码的情况下缩短这段时间?我的意思是,它必须受我的RAM或我的CPU限制吗?

2 个答案:

答案 0 :(得分:3)

您的程序不仅限于少量内存。由于它最有可能被编译为32位应用程序,因此默认情况下它最多可以分配2 GB的ram。

所以,不,内存很可能不是你的问题,除非你经常请求并再次释放它(但即便如此,它仍然取决于你的代码)。

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

您也可以使用模板和instanziation在编译时优化算法,但又不知道代码......没有。


自编辑以来:

瓶颈是 - 正如已经提到的 - 重复调用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

答案 1 :(得分:1)

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