草庐IT

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

coder 2023-09-12 原文

我需要计算 2 种不同算法的执行时间,然后根据执行时间确定推荐的算法。所以我对一般的算法和数据结构还很陌生,但在 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)
}

现在我不确定这是否真的在计算我需要的东西。然后每次我运行这个我总是得到不同的时间。我走在正确的道路上吗?

最佳答案

注意:现实生活中最好找一些成熟的性能测试框架。以正确的方式进行测试很困难。

如果您自己进行测试,以下是您最好做的事情的不完整列表:

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

  2. 不要忽略循环内测试计算的结果。一个聪明的编译器可以优化掉未使用的结果,并用类似空操作的东西替换它。理想情况下,编译器不能预测结果。例如:在第 i 次迭代中添加第 i(或 (i % array.length))元素排序列表到总和,最后返回总和或打印它(显然在测量时间之外)

  3. 除非您尝试测量该 IO 操作的性能,否则不要在测试算法中执行任何打印/日志记录/IO。 IO 很慢。

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

  5. 比较与将在生产中使用的优化级别相同的代码。如果您允许,今天的编译器可以非常聪明地进行优化,并且“调试”构建很容易比“发布”构建慢 10 倍。

对于排序算法,需要记住一些具体的事情,主要是:对不同的测试阵列进行多次测量

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

  2. 检查不同的数据。有些排序算法有病态的坏情况,有些则没有。有些可能在半排序数据上工作得特别快,有些则无法利用它。至少使用一些随机数据。最好不仅使用随机的。

关于Swift,计算排序算法的执行时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54191344/

有关Swift,计算排序算法的执行时间的更多相关文章

  1. ruby-openid:执行发现时未设置@socket - 2

    我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass

  2. ruby-on-rails - 使用一系列等级计算字母等级 - 2

    这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,

  3. ruby - Chef 执行非顺序配方 - 2

    我遵循了教程http://gettingstartedwithchef.com/,第1章。我的运行list是"run_list":["recipe[apt]","recipe[phpap]"]我的phpapRecipe默认Recipeinclude_recipe"apache2"include_recipe"build-essential"include_recipe"openssl"include_recipe"mysql::client"include_recipe"mysql::server"include_recipe"php"include_recipe"php::modul

  4. ruby-on-rails - Ruby 检查日期时间是否为 iso8601 并保存 - 2

    我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby​​是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查

  5. ruby - 为什么 Ruby 的 each 迭代器先执行? - 2

    我在用Ruby执行简单任务时遇到了一件奇怪的事情。我只想用每个方法迭代字母表,但迭代在执行中先进行:alfawit=("a".."z")puts"That'sanalphabet:\n\n#{alfawit.each{|litera|putslitera}}"这段代码的结果是:(缩写)abc⋮xyzThat'sanalphabet:a..z知道为什么它会这样工作或者我做错了什么吗?提前致谢。 最佳答案 因为您的each调用被插入到在固定字符串之前执行的字符串文字中。此外,each返回一个Enumerable,实际上您甚至打印它。试试

  6. ruby-on-rails - 将 Ruby 中的日期/时间格式化为 YYYY-MM-DD HH :MM:SS - 2

    这个问题在这里已经有了答案:Railsformattingdate(4个答案)关闭4年前。我想格式化Time.Now函数以显示YYYY-MM-DDHH:MM:SS而不是:“2018-03-0909:47:19+0000”该函数需要放在时间中.现在功能。require‘roo’require‘roo-xls’require‘byebug’file_name=ARGV.first||“Template.xlsx”excel_file=Roo::Spreadsheet.open(“./#{file_name}“,extension::xlsx)xml=Nokogiri::XML::Build

  7. ruby - 查找字符串中的内容类型(数字、日期、时间、字符串等) - 2

    我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s

  8. ruby - 检查是否通过 require 执行或导入了 Ruby 程序 - 2

    如何检查Ruby文件是否是通过“require”或“load”导入的,而不是简单地从命令行执行的?例如:foo.rb的内容:puts"Hello"bar.rb的内容require'foo'输出:$./foo.rbHello$./bar.rbHello基本上,我想调用bar.rb以不执行puts调用。 最佳答案 将foo.rb改为:if__FILE__==$0puts"Hello"end检查__FILE__-当前ruby​​文件的名称-与$0-正在运行的脚本的名称。 关于ruby-检查是否

  9. 区块链之加解密算法&数字证书 - 2

    目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非

  10. postman——集合——执行集合——测试脚本——pm对象简单示例02 - 2

    //1.验证返回状态码是否是200pm.test("Statuscodeis200",function(){pm.response.to.have.status(200);});//2.验证返回body内是否含有某个值pm.test("Bodymatchesstring",function(){pm.expect(pm.response.text()).to.include("string_you_want_to_search");});//3.验证某个返回值是否是100pm.test("Yourtestname",function(){varjsonData=pm.response.json

随机推荐