【发布时间】:2017-12-18 02:14:18
【问题描述】:
我目前正在开发一个测试程序,以确保主板上的孔不会彼此太靠近或不会重叠。
为了做到这一点,我将所有孔的 X、Y 坐标和半径保存在称为holeInfo 的对象和列表holeInfoList 中的对象中。
我目前正在使用嵌套的 for 循环来遍历所有孔,并使用基本数学公式来检查孔之间的距离。
这是我使用的函数:
public void checkHoleConditions()
{
for (int i = 0; i < holeInfoList.Count - 1; i++)
{
errorType = new List<string>();
for (int j = i + 1; j < holeInfoList.Count; j++)
{
holeMinSpaceFailed = false;
if (failsHoleConditions(holeInfoList[i], holeInfoList[j]))
{
if (holeMinSpaceFailed)
{
errorType.Add("X: " + holeInfoList[j].holeXCoordinate + " Y: " + holeInfoList[j].holeYCoordinate + "R: " + holeInfoList[j].holeDiameter + " too close.");
}
else
{
errorType.Add("X: " + holeInfoList[j].holeXCoordinate + " Y: " + holeInfoList[j].holeYCoordinate + "R: " + holeInfoList[j].holeDiameter + " overlap.");
}
invalidHole = new InvalidHole(holeInfoList[i], errorType);
invalidHoleList.Add(invalidHole);
Console.WriteLine("Hole Error Detected");
}
else
{
Console.WriteLine("Hole Check Successful");
}
}
}
}
public bool failsHoleConditions(HoleInfo holeOne, HoleInfo holeTwo)
{
float holeOneXCoordinate = holeOne.holeXCoordinate;
float holeOneYCoordinate = holeOne.holeYCoordinate;
float holeOneRadius = holeOne.holeDiameter / 2;
float holeTwoXCoordinate = holeTwo.holeXCoordinate;
float holeTwoYCoordinate = holeTwo.holeYCoordinate;
float holeTwoRadius = holeTwo.holeDiameter / 2;
float holeXDifferenceSquared = (float)Math.Pow((holeOneXCoordinate - holeTwoXCoordinate), 2);
float holeYDifferenceSquared = (float)Math.Pow((holeOneYCoordinate - holeTwoYCoordinate), 2);
float distanceBetweenCenters = (float)Math.Sqrt(holeXDifferenceSquared + holeYDifferenceSquared);
float distanceBetweenHoles = distanceBetweenCenters - (holeOneRadius + holeTwoRadius);
if (distanceBetweenHoles <= 0)
{
return true;
}
else if (distanceBetweenHoles <= minimumSpace)
{
holeMinSpaceFailed = true;
return true;
}
return false;
}
目前,我的程序在大约 2.5 分钟内完成了 254 个列表对象的测试。考虑到这是一个测试程序,254洞2.5分钟就够长了。
我可以实施哪些算法来加快测试运行速度?
【问题讨论】:
-
这似乎更适合代码审查?
-
并行化您的代码(例如 Parallel.For),也许可以尝试使用 stringbuilder 而不是 string,不确定在这种情况下什么会更快。
-
@VladimirArustamian 我不确定 stringbuilder 会在哪里提供帮助?此外,您必须小心并行运行嵌套循环。
-
您当前将向控制台写入数千行。在某些情况下,控制台可能成为瓶颈。你试过删除它吗?接下来,您是否对代码进行了分析以找出速度慢的地方?
failsHoleConditions是做什么的? -
@JonSkeet failedHoleCondition 只是使用一些基本的数学公式计算中心之间的距离,然后根据 if-else if 语句运行它们。如果您愿意,我也可以发布代码。至于控制台,后来我开始在控制台上写,在我看到这个过程花费了很多时间后,看看程序是否真的还在工作。
标签: c# algorithm list object for-loop