【发布时间】:2015-02-10 23:21:35
【问题描述】:
我注意到有些代码需要很长时间才能在 Visual Studio 中执行,而不是使用 CL 手动编译并运行可执行文件。
下面是展示这种行为的代码示例:
int DP[MAX][MAX];
class CartInSupermarketEasy {
public:
int calc(int N, int K) {
clock_t begin = clock();
for (int i = 0; i < MAX; ++i) {
DP[0][i] = 0;
DP[1][i] = 1;
DP[i][0] = i;
}
for (int n = 1; n <= N; ++n) {
for (int k = 0; k <= K; ++k) {
int min_res = N;
for (int i = 1; i < n; ++i) {
for (int j = 0; j < k; ++j) {
int curr_res = max(DP[n - i][k - 1 - j], DP[i][j]) + 1;
min_res = min(curr_res, min_res);
}
}
DP[n][k] = min(min_res, DP[n - 1][k] + 1);
}
}
clock_t end = clock();
double elapsed_secs = double(end - begin) / CLOCKS_PER_SEC;
cout << elapsed_secs << '\n';
return DP[N][K];
}
} CI;
int main(){
cout << CI.calc(100,100) << '\n';
return 0;
}
在 VS2013 中运行时,函数 calc 大约需要 13.5 秒来计算答案。在 VS2012 中,这下降到 3.5 秒。但是,当使用 CL(或我尝试过的任何其他编译器)手动编译时,可执行文件会在 0.4 秒内返回答案。
如何解释这种差异,如何使 VS 执行与手动编译/执行相当?
谢谢。
【问题讨论】:
-
您是否在比较 release 与 release 以及相同的优化级别(或同等级别)?
-
您是在使用或不使用 IDE 的情况下对 Visual Studio 版本进行计时吗?
-
是的,我实际上并没有将其与发布进行比较,而是与调试构建进行比较。谢谢你,也感谢之前发表评论的 Pawel,但我再也看不到他的评论了。
-
您使用的是
std::max函数还是您自己编写的函数?与min函数相同。编译器可能有这些函数的优化版本。 -
顺便问一下,您可以安全地访问您的阵列吗?当
k小于等于j时,使用max函数时会有负索引。
标签: c++ visual-studio visual-studio-2012 visual-studio-2013 execution-time