以下是在x86-64上设置C中的单个位的两种方法:
inline void SetBitC(long *array, int bit) {
//Pure C version
*array |= 1<<bit;
}
inline void SetBitASM(long *array, int bit) {
// Using inline x86 assembly
asm("bts %1,%0" : "+r" (*array) : "g" (bit));
}
Run Code Online (Sandbox Code Playgroud)
使用带有-O3 -march=core2
选项的GCC 4.3,与常量一起使用时,C版本需要大约90%的时间bit
.(两个版本编译为完全相同的汇编代码,但C版本使用or [1<<num],%rax
指令而不是bts [num],%rax
指令)
与变量一起使用时bit
,C版本表现更好,但仍然明显慢于内联汇编.
重置,切换和检查位具有类似的结果.
为什么GCC对这种常见操作的优化程度如此之差?我是否在使用C版本做错了什么?
编辑:对不起,等待漫长的等待,这是我用来进行基准测试的代码.它实际上是一个简单的编程问题...
int main() {
// Get the sum of all integers from 1 to 2^28 with bit 11 always set
unsigned long i,j,c=0;
for …
Run Code Online (Sandbox Code Playgroud) 假设你有一个类似于以下的结构:
struct Person {
int gender; // betwwen 0-1
int age; // between 0-200
int birthmonth; // between 0-11
int birthday; // between 1-31
int birthdayofweek; // between 0-6
}
Run Code Online (Sandbox Code Playgroud)
在性能方面,哪个是存储每个字段的最佳数据类型?(例如位字段,int
,char
等)
它将用于x86处理器并完全存储在RAM中.需要存储相当大的数量(50,000+),因此需要考虑处理器缓存等.
编辑:好的,让我重新解释一下这个问题.如果内存使用不重要,并且无论使用哪种数据类型,整个数据集都不适合缓存,通常最好使用较小的数据类型将更多数据放入CPU缓存中,或者更好地使用更大的数据类型数据类型允许CPU执行更快的操作?我要求此仅供参考,因此不应考虑代码可读性等.