2014-10-05 45 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