很简单的问题:
我有一个程序在整数和长期内进行大量的数学计算.为了适应额外的一点,我做了长长的无符号,因为我只处理正数,现在可以得到更多的值.
奇怪的是,这给了我15%的性能提升,我确认这只是简单地让所有长长的未签名.
这可能吗?使用无符号数字,数学运算真的更快吗?我记得读过没有区别,编译器会自动选择最快的方式,无论是签名还是未签名.这个15%的提升真的是因为vars没有签名,还是可能是我的代码中的其他东西?
而且,如果它真的是从制作无符号瓦尔,应我的目标是让一切(甚至整数)无符号,因为我从来不需要负数,并且每一秒都是重要的,如果我能救它.
Joh*_*ley 12
在某些操作中,有符号整数更快,而在其他操作中,无符号整数更快:
在C中,可以假定有符号整数运算不包装.例如,编译器将在循环优化中利用这一点.比较可以类似地进行优化.(如果您不期望这样,这也会导致细微的错误).
另一方面,无符号整数没有这个假设.但是,不必处理符号对于某些操作来说是一个很大的优势,例如:除法.通过2的常数幂进行的无符号除法是一个简单的移位,但是(取决于你的舍入规则)对于负数有一个有条件的除1.
就个人而言,我习惯只使用无符号整数,除非我真的确实有一个需要签名的值.性能与正确性无关.
您可能会看到长效放大的效果,在我的情况下(我猜)是64位.CPU通常没有单一指令来处理这些类型(在32位模式下),因此签名操作的轻微增加的复杂性将更加明显.