ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【常数优化】使用 register 修饰符来加快运行速率

2019-09-16 13:38:00  阅读:267  来源: 互联网

标签:typedef register ++ 修饰符 unsigned ull 速率 include


register 修饰
如果可能,将变量放入寄存器。
放入寄存器的变量在进行操作时的速度会大大提升,但不能再通过&符号取地址。不是所有类型的变量都可以放入寄存器。另外,放入寄存器后,寄存器的这部分空间不能再被其它内容使用;而且,如果将不是频繁使用的变量放入寄存器,运行时间不会有明显的缩短。因此,不适当地将变量放入寄存器,反而有可能降低运行速度。

演示平台:
Core-i5 8400 + 24 GB DDR4 2666 2CH
分别用MSVC编译器和GCC各跑若干次。
代码1无register修饰:

#include<cstdio>
#include<chrono>
#include<string>
#include<array>
#include<algorithm>
#include<ctime>
#pragma warning(disable:4996)
typedef unsigned char uchar; typedef unsigned short ushort; typedef unsigned uint; typedef long long ll; typedef unsigned long long ull;
std::chrono::time_point<std::chrono::steady_clock, std::chrono::nanoseconds> T, t;
int main() {
	t = std::chrono::steady_clock::now();
	ull a = 0, b = 1, c = 2, d = 3, e = 4, f = 5, g = 6, h = 7;
	for (ull i = 0; i < 1000; ++i)
		for (ull j = 0; j < 1000; ++j)
			for (ull k = 0; k < 1000; ++k)
				++a, ++b, ++c, ++d, ++e, ++f, ++g, ++h;
	T = std::chrono::steady_clock::now();
	printf("Duration = %lf ms\n", (T - t) / 1e6);
	system("pause");
	return 0;
}

代码2有register修饰:

#include<cstdio>
#include<chrono>
#include<string>
#include<array>
#include<algorithm>
#include<ctime>
#pragma warning(disable:4996)
typedef unsigned char uchar; typedef unsigned short ushort; typedef unsigned uint; typedef long long ll; typedef unsigned long long ull;
std::chrono::time_point<std::chrono::steady_clock, std::chrono::nanoseconds> T, t;
int main() {
	t = std::chrono::steady_clock::now();
	register ull a = 0, b = 1, c = 2, d = 3, e = 4, f = 5, g = 6, h = 7;
	for (register ull i = 0; i < 1000; ++i)
		for (register ull j = 0; j < 1000; ++j)
			for (register ull k = 0; k < 1000; ++k)
				++a, ++b, ++c, ++d, ++e, ++f, ++g, ++h;
	T = std::chrono::steady_clock::now();
	printf("Duration = %lf ms\n", (T - t) / 1e6);
	system("pause");
	return 0;
}

实验结果:

结论:MSVC编译器忽略register修饰符,但是GCC不忽略。适当采用register修饰变量能大大提升程序的执行速度。在算法竞赛中由于多采用GCC / G++编译器,这一点能够减小常数,降低卡常风险。

标签:typedef,register,++,修饰符,unsigned,ull,速率,include
来源: https://blog.csdn.net/COFACTOR/article/details/100884707

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有