3

我是这个论坛的新手,所以如果我不是第一次问的问题,请原谅。我认为这里没有必要提供代码,因为我认为它与代码无关,而且问题可能更笼统。

我在 Windows XP 中使用 MinGW (g++) 在 NetBeans 7.1.2 中编写并构建了一个 C++ 项目。Debug 版本和 Release 版本都可以正常工作并提供所需的计算输出。但是,如果我在 NetBeans 的内部终端中“运行”该项目(任一项目),我可以测量 115 到 130 微秒之间的计算时间。如果我在 Windows 命令提示符下执行 exe 文件,我测量的计算时间在 500 到 3000 微秒之间。(在具有 2 GB Ram 的 2.2 GHz Intel Core 2 Duo 上。我通过读取自复位后的 cpu 时钟滴答数并除以 cpu 频率来测量时间。)
我在另一台计算机(包括构建项目)上尝试了相同的操作,也是 2.2 GHz 和 16 GB Ram 和 Windows7。程序运行得快一点,但模式是一样的。当我从 NetBeans 但在外部终端(也是 Windows 终端)中运行项目时,情况也是如此。它适用于两个版本,调试版和发布版。

其中一项计算(不是最关键的)是快速傅立叶变换,它依赖于 fftw(http://www.fftw.org/)“libfftw3-3.dll”库。在 NetBeans 中,它的位置是已知的,在 windows 命令提示符下,dll 必须与可执行文件位于同一目录中。

为什么程序在 NetBeans 的内部终端窗口中比在 Windows 命令提示符窗口中运行得快得多?

它可能与加载时库的动态链接有关吗?
但是,实际上在 Windows 命令提示符中比在 NetBeans 终端中花费更长的计算步骤并不依赖于 dll 中的函数(两个复数相乘)。

程序中最耗时和最关键的计算是两个复数类型数组的乘法,fftw_complexdouble[2]

for(int i = 0; i < n; ++i) {  

    double k1 = x[i][0] * (y[i][0] - y[i][1]);  
    double k2 = (y[i][1] * -1) * (x[i][0] + x[i][1]);  
    double k3 = y[i][0] * (x[i][1] - x[i][0]);  


    result[i][0] = k1 - k2;  
    result[i][1] = k1 + k3;  
}  

x并且y是两个复数数组,其中[i][0]包含实部和[i][1]虚部。result是相同类型的预分配数组。
当程序在 NetBeans 的内部终端中执行时,对于长度为 513 的数组,这个循环大约需要 5 微秒,而当我在 Windows 命令提示符下运行程序时,需要 100 微秒。我无法在 sehe 的答案中找到所有真正有用的建议的解释。

请让我知道,如果您认为它与实际代码有关,那么我会提供一些。

我一直在寻找类似的问题,但找不到任何问题。感谢您对我可能错过的其他问题和答案的任何提示或要点。干杯。

4

1 回答 1

1

根据我的评论:

你做很多控制台 IO 吗?微软的控制台窗口是出了名的慢

还要查看 ENVIRONMENT 变量,特别是:

于 2012-05-10T13:05:25.343 回答