我试图衡量在访问值类型和引用类型列表时使用a for和a 的区别foreach.
我使用以下类进行分析.
public static class Benchmarker
{
public static void Profile(string description, int iterations, Action func)
{
Console.Write(description);
// Warm up
func();
Stopwatch watch = new Stopwatch();
// Clean up
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
watch.Start();
for (int i = 0; i < iterations; i++)
{
func();
}
watch.Stop();
Console.WriteLine(" average time: {0} ms", watch.Elapsed.TotalMilliseconds / iterations);
}
}
Run Code Online (Sandbox Code Playgroud)
我用double我的价值类型.我创建了这个'假类'来测试引用类型:
class DoubleWrapper
{
public double Value { get; set; }
public DoubleWrapper(double value)
{
Value …Run Code Online (Sandbox Code Playgroud) 通过编码是否有任何(非微优化)性能增益
float f1 = 200f / 2
Run Code Online (Sandbox Code Playgroud)
在比较中
float f2 = 200f * 0.5
Run Code Online (Sandbox Code Playgroud)
几年前我的一位教授告诉我,浮点除法比浮点乘法慢,但没有详细说明原因.
这句话适用于现代PC架构吗?
UPDATE1
关于评论,请同时考虑这个案例:
float f1;
float f2 = 2
float f3 = 3;
for( i =0 ; i < 1e8; i++)
{
f1 = (i * f2 + i / f3) * 0.5; //or divide by 2.0f, respectively
}
Run Code Online (Sandbox Code Playgroud)
更新2 从评论中引用:
[我想]知道什么是算法/架构要求导致>除法在硬件上比复制要复杂得多
如果C#编译器/抖动在所使用的硬件上可用,是否使用融合的乘法加法运算?如果可以,我是否需要设置任何特定的编译器设置才能利用它?
我的意图是将补偿算法用于扩展精度算术,并且其中一些可以编写为使用FMA。
引用(感谢作者开发和共享算法!):
https://tavianator.com/fast-branchless-raybounding-box-intersections/
由于现代浮点指令集可以在没有分支的情况下计算最小值和最大值
作者的相应代码就是
dmnsn_min(double a, double b)
{
return a < b ? a : b;
}
Run Code Online (Sandbox Code Playgroud)
我很熟悉例如_mm_max_ps,但这是一个矢量指令.上面的代码显然是用于标量形式.
题:
以防万一:我熟悉在C++中使用min和max函数,相信它是相关的,但不是我的问题.