gpt4 book ai didi

c# - 为什么 MapPoint.Route.Calculate() 比应用程序本身的计算慢得多?

转载 作者:太空宇宙 更新时间:2023-11-03 14:22:54 26 4
gpt4 key购买 nike

我刚刚使用 mappoint api 通过代码尝试了多个路由。它工作正常,但一些路线需要极长的时间来计算(18.5 秒)。如果我通过 MapPoint 本身计算相同的路线,它只需要不到 2 秒。

在上面的例子中,我计算了德国乌尔姆和曼海姆之间的路线。

class CalculateTime : IDisposable
{

MapPoint.Application app;
MapPoint.Map map;
MapPoint.Route route;

public CalculateTime()
{
app = (MapPoint.Application)Activator.CreateInstance(Type.GetTypeFromProgID("mappoint.application"));
map = app.ActiveMap;
route = map.ActiveRoute;
}

public class Place
{
public string City { get; set; }
public string Street { get; set; }
public string Postal { get; set; }

public Place(string City = "", string Street = "", string Postal = "")
{
this.City = City;
this.Street = Street;
this.Postal = Postal;
}
}

public class Place
{
public string City { get; set; }
public string Street { get; set; }
public string Postal { get; set; }

public Place(string City = "", string Street = "", string Postal = "")
{
this.City = City;
this.Street = Street;
this.Postal = Postal;
}
}

public TimeSpan Calculate(Place From, Place To)
{
Stopwatch sw = new Stopwatch();


MapPoint.FindResults frFromCollection = map.FindAddressResults(City: From.City, Street: From.Street, PostalCode: From.Postal);
MapPoint.FindResults frToCollection = map.FindAddressResults(City: To.City, Street: To.Street, PostalCode: To.Postal);

object frFrom = frFromCollection[1];
object frTo = frToCollection[1];

route.Waypoints.Add(frFrom);
route.Waypoints.Add(frTo);

sw.Start();
route.Calculate();

TimeSpan time = new TimeSpan(0, (int)(route.DrivingTime * 24 * 60), 0);
route.Clear();

sw.Stop();

Marshal.ReleaseComObject(frFromCollection);
Marshal.ReleaseComObject(frToCollection);
Marshal.ReleaseComObject(frFrom);
Marshal.ReleaseComObject(frTo);

MessageBox.Show(sw.Elapsed.Seconds + "." + sw.ElapsedMilliseconds);
return time;
}

public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}

~CalculateTime()
{
Dispose(false);
}

protected virtual void Dispose(bool disposing)
{
if (disposing)
{
map.Saved = true;
Marshal.ReleaseComObject(route);
Marshal.ReleaseComObject(map);

app.Quit();
Marshal.ReleaseComObject(app);
}
}
}

我记得有另一种方法可以计算显示弹出窗口的路线(不是 MapPoint.Route.Calculate(),但我忘记了。

有人知道如何加速计算吗?

问候哇哇

编辑:我刚试过这个:通过代码添加航点,但通过 MapPoint 本身计算路线。这也需要很长时间。不知何故,Waypoint 似乎是问题所在,而不是 Calculate 方法

编辑:

看起来 MapPoint 已经在后台计算了路线。如果我在调用 Calculate 之前等待几秒,它会在毫秒内完成。

最佳答案

除了每次都使应用程序假脱机外,请记住 COM 接口(interface)会增加一些开销。不多,但这是需要注意的事情。

我还注意到 MapPoint 2010 需要一两秒钟的时间来加载 - 比早期版本更长。

正如 Marc 所指出的,隐藏大部分 map 显示可以导致大约 30% 的加速,因为 MapPoint 不必显示路线。

最后,路线计算会根据路点位置和道路密度/复杂性而有很大差异。一条路线可能需要 0.5 秒来计算,但其他地方类似长度的路线需要 2-3 秒。

最后,最后 :-),MapPoint 的许多方面都针对人类用户而不是 API 使用进行了优化。例如,垃圾回收绝对是面向人的,而不是面向批处理 API 的优化。 (MapPoint 将随着大量批处理 API 的使用而变慢,因为垃圾收集器对于此类工作的调用频率不够高)

关于c# - 为什么 MapPoint.Route.Calculate() 比应用程序本身的计算慢得多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4862319/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com