小编cha*_*ox2的帖子

更有效的半正矢函数

在我之前的问题中,我希望根据函数结果加速列表选择。现在,我的瓶颈是函数本身。

这是一个基本的半正弦函数,使用以下代码:

private static double Haversine(double lat1, double lat2, double lon1, double lon2)
{            
    const double r = 6371e3; // meters
    var dlat = (lat2 - lat1)/2;
    var dlon = (lon2 - lon1)/2;

    var q = Math.Pow(Math.Sin(dlat), 2) + Math.Cos(lat1) * Math.Cos(lat2) * Math.Pow(Math.Sin(dlon), 2);
    var c = 2 * Math.Atan2(Math.Sqrt(q), Math.Sqrt(1 - q));

    var d = r * c;
    return d / 1000;
}
Run Code Online (Sandbox Code Playgroud)

那么……为什么需要这么快?问题是我经常调用它。向北思考 16,500,000 次。

显然,这已经很多了。在我的用例中,我传递给它必须从中获取位置数据的对象,然后将纬度和经度转换为弧度,这进一步增加了时间(仅增加了约 15%)。我不知道对此我能做些什么,但我确实知道,通过纯粹以弧度加倍的方式传递它(如上所述),大约需要 4.5 秒——这超过了我的实现中处理时间的 75%。为 q …

c# math optimization trigonometry

4
推荐指数
2
解决办法
9953
查看次数

标签 统计

c# ×1

math ×1

optimization ×1

trigonometry ×1