c#中最快的fabsf(浮点绝对值函数)实现是什么?

c#中最快的fabsf(浮点绝对值函数)实现是什么?,c#,unity3d,mathematical-optimization,absolute-value,math-functions,C#,Unity3d,Mathematical Optimization,Absolute Value,Math Functions,我正在优化Unity 3d游戏中最苛刻的功能。最昂贵的子例程是unity Mathf.Abs方法,它在浮点值上被调用(从不加倍)。在某些情况下,对该函数的调用会给帧渲染延迟增加多毫秒。代码库是保密的,所以你必须相信我的话,Abs调用是算法的核心 在深入剖析时,我发现mathf。Abs只是一个调用速度更快的system.math.Abs的包装器,用于双打。看起来,如果我可以完全避免使用包装器,只需调用为float32设计的system.Math.Abs的等价物,我就可以免费获得显著的加速 有人能给

我正在优化Unity 3d游戏中最苛刻的功能。最昂贵的子例程是unity Mathf.Abs方法,它在浮点值上被调用(从不加倍)。在某些情况下,对该函数的调用会给帧渲染延迟增加多毫秒。代码库是保密的,所以你必须相信我的话,Abs调用是算法的核心

在深入剖析时,我发现mathf。Abs只是一个调用速度更快的system.math.Abs的包装器,用于双打。看起来,如果我可以完全避免使用包装器,只需调用为float32设计的system.Math.Abs的等价物,我就可以免费获得显著的加速

有人能给我解释一下为什么很难找到一个吗?我在NuGet上测试的float libs也在转换双版本的结果


我研究了使用float_long联合结构和掩蔽操作的GNU实现。有没有人能指导我在自己的名称空间中实现这一点,或者找到一个可以帮助我的名称空间

那么
float abs=x<0呢-x:x?这可能是你能达到的最快速度了。我用你的解决方案获得了大约2倍的加速。我觉得不尝试这一点很愚蠢,我想我必须做更多的争吵,但结果又是编译器挽救了这一天。如果您想获得一些额外的积分,请解释GNU实现中的union结构的用途。顺便说一句,您只需在
浮点值上使用(=
单个
)值。最快的方法可能包括手动更改浮点值的符号位。我不打算为你们做基准测试,因为我现在是凌晨3点,但它可能涉及创建一个标记为不安全的函数,用
int bits=*(int*)(&val)之类的东西重新解释为int
,使用类似于
位的内容更改符号位&=~(1)一个相关的问题/答案。请注意,使用SSE指令集,您可以一次执行多个晶圆厂。关于
float abs=x<0?-x:x;
?这可能是您所能获得的最快的速度。您的解决方案使我的速度提高了大约2倍。我觉得不尝试这一点很愚蠢,我想我必须进行更多的争论,但结果是compiler再次拯救了这一天。如果你想要一些额外的积分,请解释GNU实现中的union结构是用来做什么的。顺便说一句,你可以简单地在
float
(=
Single
)上使用值最快的方法可能包括手动更改浮点值的符号位。我不打算为您进行基准测试,因为现在对我来说是凌晨3点,但可能需要创建一个标记为不安全的函数,用
int bits=*(int*)(&val)之类的内容将其重新解释为int;
,使用类似于
位&=~(1)的符号位更改相关问题/答案。请注意,使用SSE指令集,您可以一次执行多个FAB。