【发布时间】:2018-09-09 06:39:01
【问题描述】:
当我尝试对其进行性能测试时,我使用我所做的方法有一些奇怪的行为,基本上如果我注释掉/禁用其中一个 if 语句中的返回之一,它会从 400 毫秒变为 4 毫秒,几乎就像它正在被编译掉,而不是实际运行代码,如果在注释/禁用一个返回之后,它只返回 true 或 false ,所以它只有一个选项,然后我可以看到编译器如何会对其进行优化并始终将其设置为布尔值而不是运行代码。
任何人都知道可能会发生什么或有关于运行测试的更好方法的建议吗?
我的测试代码:
Vec3 spherePos = new Vec3(43.7527, 75.9756, 0);
double sphereRadisSq = 50 * 50;
Vec3 rayPos = new Vec3(-5.32301, 5.97157, -112.983);
Vec3 rayDir = new Vec3(0.457841, 0.680324, 0.572312);
sw.Reset();
sw.Start();
bool res = false;
for (int i = 0; i < 10000000; i++)
{
res = Intersect.RaySphereFast(rayPos, rayDir, spherePos, sphereRadisSq);
}
sw.Stop();
Debug.Log($"testTime: {sw.ElapsedMilliseconds} ms");
Debug.Log(res);
还有静态方法:
public static bool RaySphereFast(Vec3 _rp, Vec3 _rd, Vec3 _sp, double _srsq)
{
double rs = Vec3.DistanceFast(_rp, _sp);
if (rs < _srsq)
{
return (true); // <-- When I disable this one
}
Vec3 p = Vec3.ProjectFast(_sp, _rp, _rd);
double pr = Vec3.Dot(_rd, (p - _rp));
if (pr < 0)
{
return (false); // <-- Or when I disable this one
}
double ps = Vec3.DistanceFast(p, _sp);
if (ps < _srsq)
{
return (true); // <-- Or when I disable this one
}
return (false);
}
Vec3 结构体(瘦身):
public struct Vec3
{
public Vec3(double _x, double _y, double _z)
{
x = _x;
y = _y;
z = _z;
}
public double x { get; }
public double y { get; }
public double z { get; }
public static double DistanceFast(Vec3 _v0, Vec3 _v1)
{
double x = (_v1.x - _v0.x);
double y = (_v1.y - _v0.y);
double z = (_v1.z - _v0.z);
return ((x * x) + (y * y) + (z * z));
}
public static double Dot(Vec3 _v0, Vec3 _v1)
{
return ((_v0.x * _v1.x) + (_v0.y * _v1.y) + (_v0.z * _v1.z));
}
public static Vec3 ProjectFast(Vec3 _p, Vec3 _a, Vec3 _d)
{
Vec3 ap = _p - _a;
return (_a + Vec3.Dot(ap, _d) * _d);
}
public static Vec3 operator +(Vec3 _v0, Vec3 _v1)
{
return (new Vec3(_v0.x + _v1.x, _v0.y + _v1.y, _v0.z + _v1.z));
}
public static Vec3 operator -(Vec3 _v0, Vec3 _v1)
{
return new Vec3(_v0.x - _v1.x, _v0.y - _v1.y, _v0.z - _v1.z);
}
public static Vec3 operator *(double _d1, Vec3 _v0)
{
return new Vec3(_d1 * _v0.x, _d1 * _v0.y, _d1 * _v0.z);
}
}
【问题讨论】:
-
你评论的是哪个回报?
-
@ChetanRanpariya 在不同的 if 语句中的三个中的任何一个。
-
这是有道理的,因为在所有情况下它都可以优化掉一堆代码,而且可能确实如此,尽管快 100 倍似乎并不正确
-
如果我们能看到
Vec3的实现会更容易。然后我们可以查看生成的 IL -
@TheGeneral 当我将循环再增加 10 倍时,它会从 ~4000ms 变为 ~28ms,这肯定是不对的。
标签: c# performance optimization