在我之前的问题中,我希望根据函数结果加速列表选择。现在,我的瓶颈是函数本身。
这是一个基本的半正弦函数,使用以下代码:
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 …