Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift,计算排序算法的执行时间_Swift_Algorithm_Performance Testing - Fatal编程技术网

Swift,计算排序算法的执行时间

Swift,计算排序算法的执行时间,swift,algorithm,performance-testing,Swift,Algorithm,Performance Testing,我需要计算两种不同算法的执行时间,然后根据执行时间确定推荐算法。因此,我对算法和数据结构一般来说是相当陌生的,但在Swift中却很孤独 所以我做了一些搜索,没有找到多少。我确实找到了这个: func printTimeElapsedWhenRunningCode(title:String, operation:()->()) { let startTime = CFAbsoluteTimeGetCurrent() operation() let timeElapse

我需要计算两种不同算法的执行时间,然后根据执行时间确定推荐算法。因此,我对算法和数据结构一般来说是相当陌生的,但在Swift中却很孤独

所以我做了一些搜索,没有找到多少。我确实找到了这个:

func printTimeElapsedWhenRunningCode(title:String, operation:()->()) {
    let startTime = CFAbsoluteTimeGetCurrent()
    operation()
    let timeElapsed = CFAbsoluteTimeGetCurrent() - startTime
    print("Time elapsed for \(title): \(timeElapsed) s.")
}
这就是我要测试的:

printTimeElapsedWhenRunningCode(title: "Merge Sort") {
    let newSort = mergeSort(sortArray)
}

现在我不确定这是否真的在计算我需要什么。然后每次我运行这个,我总是得到一个不同的时间。我走的路对吗

注意:在现实生活中,最好找到一些已建立的性能测试框架。用正确的方法做测试是很困难的

以下是一份不完整的清单,列出了如果您自己进行测试,您最好做的事情:

  • 在多次迭代中求平均值,而不是仅求一次。有很多原因导致结果有点嘈杂。如果总运行时间小于0.1秒,则很可能是完全不可靠的。最好是至少1秒。此外,不仅要跟踪平均值,还要跟踪一些其他指标,如95%百分位数

  • 不要忽略循环内测试计算的结果。智能编译器可以优化未使用的结果,并将其替换为类似no-op的内容。理想情况下,编译器不应预测结果。例如:在第次迭代中,将排序列表的第次(或第次)(i%array.length)-th)元素添加到total sum中,并在最后返回和或打印它(显然在测量时间之外)

  • 除非您试图测量IO操作的性能,否则不要在测试的算法中执行任何打印/记录/IO。木卫一很慢

  • 在主“测试”迭代之前进行一些预热迭代。这是为了确保各种CPU缓存中的所有数据都存在。如果没有热身,第一次跑步和第二次跑步可能会有很大差异。此外,如果您正在运行托管代码(如JavaScript、Java或.Net),许多运行可能会迫使VM通过一些更好的优化来重新编译代码。在这种情况下,您可能需要先运行几千次“预热”迭代来强制执行它。一些更好的测试框架运行批处理,直到不同批处理之间的时间变得稳定

  • 将代码与生产中将使用的优化级别进行比较。如果您允许的话,今天的编译器在优化方面会非常聪明,“调试”版本的速度很容易比“发布”版本慢10倍

  • 对于排序算法,有一些特定的事情需要记住,主要是:在不同的测试阵列上进行多个测量

  • 尝试不同的数组大小,从几个元素到数百万个元素。今天的内存访问是一件非常复杂的事情。不同的算法具有不同的内存使用模式,这可能会在不同的大小下极大地影响性能

  • 检查不同的数据。有些排序算法有病理学上不好的情况,有些则没有。有些可能在半排序数据上工作得特别快,有些则无法利用它。至少使用一些随机数据。不过,最好不要只使用随机变量


  • 如果您想对性能进行基准测试,那么使用单元测试“
    measure{…}
    块是一个很好的起点,因为它会运行几次并计算运行时间、标准偏差等

    我还建议:

    • 使用排序相对有效的类型(例如,
      [Int]
      而不是
      [String]
      )对其进行测试,以便将重点放在排序速度而不是比较速度上)
    • 进行具有可观察时间的排序(例如,大型数组),并多次重复排序;及
    • 对最终结果做一些简单的事情,这样如果您测试一个优化的构建,您就不会冒险让它优化出一些生成您不使用的结果的代码
    但是对于快速性能测试,Xcode单元测试非常简单。例如:

    class MyAppTests: XCTestCase {
    
        let iterationCount = 1_000
    
        // build large array
    
        var array = (0 ..< 1_000).map { _ in Int.random(in: 0 ..< 1_000_000) }
    
        // test performance
    
        func testSortPerformance() {
            measure {
                for _ in 0 ..< iterationCount {
                    let results = array.sorted()
                    XCTAssert(!results.isEmpty)
                }
            }
        }
    
        func testBubbleSortPerformance() {
            measure {
                for _ in 0 ..< iterationCount {
                    let results = array.bubbleSorted()
                    XCTAssert(!results.isEmpty)
                }
            }
        }
    }
    
    而且,当我在做这件事时,我可能也会测试排序算法本身,例如,确保结果是递增的,并且所有项目的总和仍然相加:

    func testBubbleSort() {
        let results = array.bubbleSorted()
    
        var previous = results[0]
        for index in 1 ..< results.count {
            let current = results[index]
            XCTAssertLessThanOrEqual(previous, current)
            previous = current
        }
    
        XCTAssertEqual(results.sum(), array.sum())
    }
    
    func testBubbleSort(){
    让结果=array.bubbleSorted()
    var previous=结果[0]
    对于1中的索引..
    如何/在何处运行此代码?不要使用操场。用完全优化的发布版本测试代码。我一直在操场上做所有事情。我会用更多的信息更新我的帖子。永远不要尝试在操场上进行任何性能测试。这是为了作业。不是真实的世界。我们被告知找到排序算法并测试执行情况。基本上,分配是通过不同的排序算法进行的。我只需要一些方法来显示算法的执行时间。我继续,刚刚启动了一个swift控制台应用程序。我不需要使用操场,这是很好的信息。老实说,我觉得这是迄今为止最好的帮助,但我觉得最终我需要的是复杂的。我可能错了。这件事我还没开始,但我正计划着去做。我有一个9整数的数组。我只需要使用我选择的任何两种排序方法对它们进行排序。然后我需要知道计算每种排序的执行时间。然后根据时间对它们进行比较,并推荐最佳时间。我只需要知道我上面提交的代码是在简单的层次上还是在正确的方向上做了我需要的事情。您的方法是在正确的方向上,但是使用9个整数的数组测试一次迭代可能不会产生统计上显著的结果,这就是为什么我建议使用更大的数组和更多的迭代