C# 您的性能损失来自外部调用,因此不是算法/CPU的性能问题 GetBuildByBuildNumber GetTestRunByBuildUri GetListOfTestResultsByID

C# 您的性能损失来自外部调用,因此不是算法/CPU的性能问题 GetBuildByBuildNumber GetTestRunByBuildUri GetListOfTestResultsByID,c#,algorithm,sorting,C#,Algorithm,Sorting,都是同步执行rest查询的,因此大大降低了算法的速度 由于循环上的每个迭代都不依赖于之前的迭代,因此可以使循环中的所有逻辑异步运行。从理论上讲,这将使执行时间降到最坏的情况,即GetBuildByBuildNumber+GetTestRunByBuildUri+GetListOfTestResultsByID首先,您可以使用dataen字典或更好的哈希集来使用包含()而不是用于比较标题的循环。其次,我将删除对ReasonHandler的冗余调用。给定reasonFromErrorMessage(

都是同步执行rest查询的,因此大大降低了算法的速度



由于循环上的每个迭代都不依赖于之前的迭代,因此可以使循环中的所有逻辑异步运行。从理论上讲,这将使执行时间降到最坏的情况,即
GetBuildByBuildNumber
+
GetTestRunByBuildUri
+
GetListOfTestResultsByID

首先,您可以使用
dataen
字典
或更好的
哈希集
来使用
包含()
而不是用于比较标题的
循环。其次,我将删除对
ReasonHandler的冗余调用。给定reasonFromErrorMessage()
,将结果保存到一个变量中,然后使用它。如果这些数据存储在数据库中(不是已经存在吗?),那么您将得到运行查询优化器的建议,在适当的地方添加索引,或者有意地取消表的规范化。数据缩减始终是一种选择,在单元测试的情况下,没有人对没有失败的测试特别感兴趣。因此,您最好只存储成功的第一次和最后一次测试运行。代码中确实有一些部分可以优化,但是您确定方法的缓慢实际上来自于CPU的迭代和性能,而不是像查询那样的延迟吗?您很可能会多次调用:
getestrunbybuilduri
GetListOfTestResultsByID
这些都是查询远程数据吗?O(N)+O(N^4)没有什么意义。只要写O(N^4)。如果你想执行所有这些测试,没有比。。。表演它们。循环本身并不重要。你是对的,Yves Dao一定不知道我为什么添加+O(n)。首先,你可以制作
dataen
a
Dictionary
或更好的
Hashset
,使用
Contains()
代替
循环来比较标题。其次,我将删除对
ReasonHandler的冗余调用。给定reasonFromErrorMessage()
,将结果保存到一个变量中,然后使用它。如果这些数据存储在数据库中(不是已经存在吗?),那么您将得到运行查询优化器的建议,在适当的地方添加索引,或者有意地取消表的规范化。数据缩减始终是一种选择,在单元测试的情况下,没有人对没有失败的测试特别感兴趣。因此,您最好只存储成功的第一次和最后一次测试运行。代码中确实有一些部分可以优化,但是您确定方法的缓慢实际上来自于CPU的迭代和性能,而不是像查询那样的延迟吗?您很可能会多次调用:
getestrunbybuilduri
GetListOfTestResultsByID
这些都是查询远程数据吗?O(N)+O(N^4)没有什么意义。只要写O(N^4)。如果你想执行所有这些测试,没有比。。。表演它们。循环本身并不重要。你是对的,Yves Daos不知道我为什么添加+O(n)。嗯,我想得很好,但我只是无法实现“failedTestcases.add(new Entities.TestResult(){}”);part。它说“无法将'void'分配给annonymous类型属性”“。因此,它不允许我插入我的值RunId、RunTitle等。@kristofermarinearsson我已经更新了我的答案,请检查它是否有效这工作得更好,但当我尝试说例如:RunId=testResult.TestRun.Id时,我仍然有一个问题,因为我们找不到“testResult”,因为我们不再循环它。你知道我可以用什么来代替它吗?“.TestRun”在我们之前循环过的接口ITestResult中。@Kristofermarinearsson,对不起,复制粘贴错误,我告诉过你我没有测试它,你需要使用“y”变量而不是“testResult”,或者你可以根据需要将“y”重命名为“testResult”。无论如何,我会更新我的answer@KristoferMarEinarsson,这只是一个开始,您可以做很多事情来提高性能,许多人已经发表了评论,比如使用字典而不是列表,检查远程调用。我建议,首先检查每个方法调用,看看哪个方法调用真正需要时间,然后将其分解为可能的最佳方式。嗯,考虑得很好,但我只是无法实现“failedTestcases.add(new Entities.TestResult(){}”);part。它说“无法将'void'分配给匿名类型的属性”“。因此,它不允许我插入我的值RunId、RunTitle等。@kristofermarinearsson我已经更新了我的答案,请检查它是否有效这工作得更好,但当我尝试说例如:RunId=testResult.TestRun.Id时,我仍然有一个问题,因为我们找不到“testResult”,因为我们不再循环它。你知道我可以用什么来代替它吗?“.TestRun”在我们之前循环过的接口ITestResult中。@Kristofermarinearsson,对不起,复制粘贴错误,我告诉过你我没有测试它,你需要使用“y”变量而不是“testResult”,或者你可以根据需要将“y”重命名为“testResult”。无论如何,我会更新我的answer@KristoferMarEinarsson,这只是一个开始,您可以做很多事情来提高性能,许多人已经发表了评论,比如使用字典而不是列表,检查远程调用。我建议,首先检查每个方法调用,看看哪一个真正需要时间,然后将其分解为最好的方法。
var failedTestCases = sortedTestResults.Where(x => dataen.Contains(x.TestCaseTitle)).Select(testResult => new Entities.TestResult
{
                RunId = testResult.TestRun.Id,                      // The test Run ID
                RunTitle = testResult.TestRun.Name,
                TestResultId = testResult.Id,
                Area = testResult.Project.Name,
                // all other columns here ...
}).ToList();
GetBuildByBuildNumber

GetTestRunByBuildUri

GetListOfTestResultsByID