关闭

IDE Visual studio 优化---关于VS 的Debug版本和Release【疑惑】

标签: C++windowsvs优化
931人阅读 评论(0) 收藏 举报
分类:

今天编程遇到一个“奇怪”的现象,for循环里边,10^9次运算,居然0ms就结束,非常的不解,原来是VS自动优化导致的,具体如下:

先看一下我测试的代码:

	int a = 0;
	while (1)
	{
		int i;
		for (i = 0 ; i < 100000; i ++)
		{
			for (int j = 0 ; j < 10000 ; j ++)
			{
				a = i + j;
			}
		}
		cout <<  i << endl;
	}

读者可以试一下,使用Release版的话,这个结果肯定是0ms就把结果输出:


而使用Debug版的话,会好几秒才输出一次,为什么呢?因为Release版的话,VS做了很多优化,你会发现,上边那个代码,for循环对于while里边的其他代码毫无影响,所以我感觉VS将这段代码优化了(我不知道怎么查看优化的代码,还希望看到的朋友知道的话请留言提醒一下,非常感谢):首先检查里边那层j的for循环对于它外边的变量指向的内存是否会有影响,如果没有影响,则不执行里边部分,仅仅执行for(int i = 0 ; i < 100000 ; i ++){},而Debug不做优化,所以两层循环都进入。因此我又继续做了一个测试:

	int a = 0;
	while (1)
	{
		long i;
		for (i = 0 ; i < 1000000000; i ++)
		{
			for (int j = 0 ; j < 1; j ++)
			{
				a = i + j;
			}
		}
		cout << i << endl;
	}
也就是把10^9全部放在外边,使用Release下运行,发现依然是0ms,看来VS将for(int i = 0 ; i < 100000 ; i ++){}进一步优化,这个怎么优化?难道是直接使用for的限制100000000就输出了吗?不清楚!

	int a = 0;
	while (1)
	{
		long i;
		for (i = 0 ; i < 1000000000; i ++)
		{
			for (int j = 0 ; j < 1; j ++)
			{
				a = i + j;
				i++;
			}
		}
		cout << i << endl;
	}
这样的时候,居然时间慢下来好多,也就是发现里层循环对i有影响,执行了呗,但是这样:

	int a = 0;
	while (1)
	{
		long i;
		for (i = 0 ; i < 1000000000; i ++)
		{
			i++;
		}
		cout << i << endl;
	}
居然是0ms,而如果输出的是a:

	int a = 0;
	while (1)
	{
		long i;
		for (i = 0 ; i < 1000000000; i ++)
		{
			for (int j = 0 ; j < 1; j ++)
			{
				a = i + j;
				i++;
			}
		}
		cout << a << endl;
	}
又变成稍微长点的时间(大约0.5秒)输出,此时换成Debug版本,居然要15秒才运行出来,非常非常的不明白VS到底是如何优化的,所以对于程序中,有关遇到运行速度、效率等等地方的时候,要格外注意这个优化问题,而且不仅仅是VS,而是更底层的nmake的编译设置。











0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:338050次
    • 积分:5450
    • 等级:
    • 排名:第4914名
    • 原创:187篇
    • 转载:128篇
    • 译文:16篇
    • 评论:26条
    最新评论