C++ C++;更快的执行

C++ C++;更快的执行,c++,ram,C++,Ram,我用一个while循环来执行一些算法,但是它不是很快,我如何允许我的程序使用更多的RAM?(我认为这是限制它的原因)它目前稳定在504kB 我正在使用 C::B 13.12 Windows 7 64位 mingw32-g++.exe(我不认为我需要64位版本,除非我想使用4GB内存,对吗?) 如果这个问题以前被问过并回答过,我很抱歉,但如果有,我似乎找不到 编辑:这将扫描100个像素,是什么导致这需要2.2秒 #include <windows.h> #include <i

我用一个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;
}
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
无效扫描(HDC dc、int x、int y、int&r、int&g、int&b){
COLORREF color=GetPixel(dc,x,y);
r=GetRValue(颜色);
g=GetGValue(颜色);
b=GetB值(颜色);
}
int main(){
HDC dc=GetDC(空);
int r,g,b;
对于(int i=0;i<100;i++){
扫描(直流,100100+i,r,g,b);
}
ReleaseDC(NULL,dc);
返回0;
}

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

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

所以,不,内存很可能不是您的问题,除非您不断地请求并再次释放它(但即使这样,它也确实取决于您的代码)

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

您也可以在编译时使用模板和实例来优化算法,但仍然不知道代码。。。没有


自编辑以来:

正如前面提到的那样,瓶颈是重复调用
GetPixel()
,这本身就相当昂贵,因为还有一些工作需要完成,而这些工作没有被缓存

相反,您应该将窗口内容复制到自己的内存区域,并直接读取像素(作为字节)

你可以跟着。他们正在将位图内容/像素写入一个文件,但实际上您也需要这样做,只需直接读取该数据。只需查找变量
lpbitmap
的用法即可找到相关行

简而言之,您需要使用
BitBlt()
将屏幕截图创建为位图,然后使用
GetDIBits()
复制这些像素:


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

对于各种问题,有各种有趣的时空权衡,但没有通用的答案。所以提出的问题毫无意义。我解决数学问题总是很慢。当我叔叔给我买了一栋更大的房子时,一切都变了。现在我只是在一瞬间轻松地解决了所有的问题。好吧,@KerrekSB,如果你的旧房子太小,你甚至坐不舒服,那么情况可能确实如此以类似的方式不断切换到硬盘可能会减慢速度,但我怀疑504KB是否足够。即使回到MS-DOS时代,也很容易通过编辑启动文件来实现这些功能,而不会作弊一些语言(如Java)对应用程序可用的内存量施加限制。用C++来代替OS。这可能意味着应用程序可以占用您在机器中安装的物理RAM的数量。然而,操作系统本身可以限制应用程序的消费。如果您的机器有很多RAM,那么通过更改代码的实现方式,您的问题可能会得到改善。@Galik您是否碰巧有一个通过更改代码的实现方式来改进程序的示例?谢谢您的回答,但我不明白还有什么会限制它的执行速度。@Mandera给我们看一些代码,或者至少列出一些算法(或者至少类似的算法)。一旦你的算法变得复杂或数据足够大,你的CPU很容易就会减慢速度。我添加了一些代码,希望你能让我了解我的无知。Mandera添加了复制粘贴示例代码。这将不会开箱即用,但应该给你一个想法,连同来自MSDN的完整示例。愚蠢的我,忘记了指向MSDN的链接-现在添加了它。好吧,但实际上是什么导致它“变慢”,那会是CPU吗?那会是微软。所以不管我有一台破旧的15年旧电脑还是一台新电脑,都需要同样的时间?
// 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