同样的代码,为什么vs2019和code block运行速度差这么多
codeblocks吧
全部回复
仅看楼主
level 1
AzKing◆ 楼主
前面是cb后面是vs,速度将近差了十倍也太离谱了吧,代码是相同的,同一台机子上运行的,请问是什么问题?谢谢.
2020年12月27日 03点12分 1
level 1
AzKing◆ 楼主
代码:
#include <iostream>
#include <algorithm>
#include <time.h>
using namespace std;
//边数据结构
struct Edge
{
int a = 0;//端点
int b = 0;
int cost = INT_MAX;//花费
bool operator < (const Edge& A) const
{
return cost < A.cost;
}
};
//并查集合成
int findFather(int* father, int x) {
if (father[x] == x)
{
return x;
}
else
{
//此举为路径压缩,防止findFather退化为O(n)级算法
int tmp = findFather(father, father[x]);
father[x] = tmp;
return tmp;
}
}
//获得随机边
Edge* getRandomEdges(int n)
{
srand((unsigned)time(NULL));
int edge_n = n * (n - 1) / 2;
Edge* edges = new Edge[edge_n]();
//随机化边
int count = 0;
for (int i = 1; i <= n; i++)
{
for (int j = i + 1; j <= n; j++)
{
edges[count++] = { i,j,rand() };
//cout << count << ":" << edges[count - 1].a << "和" << edges[count - 1].b << ",cost为" << edges[count - 1].cost << endl;
}
}
return edges;
}
void kruskal(int n, Edge* edges) {
int edge_n = n * (n - 1) / 2;//计算边的个数(最多)
int* father = new int[n + 1];//并查集,可以方便计算哪些点未收并
for (int i = 0; i <= n; i++)
{
father[i] = i;//初始时,点并未连接,自己指向自己
}
sort(edges, edges + edge_n);//排序,方便实现贪婪
int edgeNum = 1;
for (int i = 0; i < edge_n; i++)
{
if (edgeNum == n)break;//一旦点足够就提前退出(一共需要n-1条边,edge_n为n平方级,但edges已经排序好,此举可以省下不少时间)
int afather = findFather(father, edges[i].a);
int bfather = findFather(father, edges[i].b);
//如果a和b的值相同说明这两个点在同一个树内
//如果值不同,则合成并输出边
if (afather != bfather)
{
edgeNum++;
father[afather] = bfather; //合并两个树(或点)
//cout << "选中边" << edges[i].a << "和" << edges[i].b << ",cost为" << edges[i].cost << endl;
}
}
delete[] father;
}
time_t MyMethodBYTime(int n)
{
Edge* edges = getRandomEdges(n);
time_t startTime = clock();
kruskal(n, edges);
time_t endTime = clock();
cout << n << "个点用时:" << endTime - startTime << "ms" << endl;
delete[] edges;
return (endTime - startTime);
}
int main() {
for (int i = 100; i <= 2000; i += 100)
{
time_t sum = 0;
for (int j = 0; j < 5; j++)
{
sum += MyMethodBYTime(i);
}
cout << i << "个点平均用时:" << sum / 5 << "ms" << endl;
}
}
2020年12月27日 03点12分 2
level 1
-O2[汗]
2021年04月28日 09点04分 3
1