使用 Swift 代码优化项目编译速度

news2024/11/23 11:38:18

引言

软件的性能是评价一个软件质量的重要指标,尤其在今天这个时代,性能已成为大型项目不可或缺的考虑因素之一。对于用户量极大的软件,如网银系统、在线购物商城等,更是必须保证其高效稳定的性能。在这种背景下,优化项目的编译速度就显得尤为重要。本文将介绍如何使用 Swift 代码优化项目编译速度。

找出编译耗时过长的文件

要优化项目的编译速度,首先需要把耗时过长的文件找出来,然后进行重点优化。这里会用到 Xcode build 的两个OTHER_SWIFT_FLAGS:

  • -Xfrontend:如果编译或类型检查时耗时多长,则在 Xcode 中输出警告。
  • -debug-time-function-bodies:输出每个函数的编译时长。

添加这些 flag 的方法为:

  1. 选中 Target
  2. 选中 Build Settings
  3. 搜索 “Other Swift Flags”
  4. 添加 -Xfrontend -debug-time-function-bodies

基于这两个 flag,有 3 个方法可以找到耗时过长的文件:

方法一:使用克魔助手

克魔助手是一款专为苹果手机 iOS 应用开发设计的辅助工具,提供了丰富的性能监控功能,帮助开发者优化应用的性能。以下是使用克魔助手找到编译耗时过长的文件的步骤:

  1. 下载克魔助手:用户可以前往克魔助手工具官网进行免费下载,该工具提供绿色软件版本,无需其他安装流程。下载后解压即可开始使用。下载地址是 https://www.keymob.com 。
    在这里插入图片描述

  2. 注册和登录:为了使用克魔助手工具,用户需要在电脑上安装并登录该工具。在登录后,用户可以继续其他操作流程。克魔开发助手提供了简单的登录码获取流程,确保用户能够方便地使用该工具。

在这里插入图片描述

3.选择文件管理界面并开始监听:双击克魔开发助手.exe 启动克魔助手后,点击右上角的登录按钮,输入邮箱后,没登录码的点击获取登录码,有的可以直接输入登录码,登录成功后,选择文件管理界面。然后自定义选择列,并点击 “开始监听” 来查看应用程序的性能情况。
在这里插入图片描述

方法二:使用 Xcode 控制台

在 Xcode 的控制台中输入以下命令即可输出时间最久的前 10 个文件:

find . -type f -name '*.swift' -exec \
  sh -c "echo '{}' && swiftc -v -c '{}' 2>&1 | awk '/^.{10}[ ]+[0-9\.]+ms/{print \$0}' | sort -rn | head -10" \;

方法三:使用 Xcode 插件

使用 Xcode 插件 SwiftLint 可以自动输出编译耗时最长的文件。安装方法如下:

  1. 打开 Terminal,输入以下命令:
brew install swiftlint
  1. 在 Xcode 中打开 Preferences(快捷键 Command + ,),选择 Text Editing,然后选择 Code completion。
  2. 在 Code completion 下面的 Fuzzy matching 一栏中,勾选 Show snippets using: 和 Swift。然后再选择 Edit All-in-One Snippet…。
  3. 进入 Snippet 编辑页面,复制以下代码并保存:
// MARK: - Performance Metrics

// Prints the compile time of each function or method in this file.
// Add to the `OTHER_SWIFT_FLAGS` build setting for the target.
// -Xfrontend -debug-time-function-bodies
//
// For more information about how to use debug-time-function-bodies see:
// - https://pspdfkit.com/blog/2018/how-to-reduce-swift-compile-times/
// - https://github.com/apple/swift/pull/13132#issuecomment-312358040
// - WWDC 2018 session 404 Optimizing Swift build times
// - https://youtu.be/nJwVabxL5Gw?t=11m16s
//
// If you add this to a Swift file, it will print the compile time of each
// method in this file to the console on build.
//
// Usage:
// In Xcode 9.x and later:
// 1. Open your project
// 2. Go to the Build Phases tab of your app's target
// 3. Click the + button in the top left and select "New Run Script Phase"
// 4. Add the following code to the script area below the shell:
//      "${PODS_ROOT}/SwiftLint/swiftlint" --no-cache --config "${PODS_ROOT}/SwiftLint/.swiftlint.yml"
//      "${PROJECT_DIR}/Scripts/perf.swift"
//    Note: You may need to customise the paths to suit your project structure.
// 5. Drag the new run script phase to be just before the "Compile Swift Sources"
//    phase in the list.
// 6. Rebuild your project (Command-B)
// 7. The compile time for each function in each source file will now be logged
//    to the console, sorted by longest compile time first.

import Foundation

let numBitsInByte = 8

extension Double {
    func rounded(toPlaces places: Int) -> Double {
        let divisor = pow(10.0, Double(places))
        return (self * divisor).rounded() / divisor
    }
}

extension String {
    func padding(toLength length: Int, withPad padCharacter: Character) -> String {
        let padding = String(repeatElement(padCharacter, count: max(0, length - count)))
        return self + padding
    }
}

func readableTime(_ time: Double) -> String {
    if time < 0.001 {
        return "< 0.001ms"
    } else if time < 1 {
        return "\(time.rounded(toPlaces: 3))ms"
    } else {
        var timeStr = "\(time.rounded(toPlaces: 2))s"
        if time > 60 {
            let minutes = Int(time / 60)
            let seconds = time.truncatingRemainder(dividingBy: 60)
            timeStr = "\(minutes)m \(seconds.rounded(toPlaces: 2))s"
        }
        return timeStr.padding(toLength: 10, withPad: " ")
    }
}

func measure<A>(name: String, _ f: () -> A) -> A {
    let start = DispatchTime.now()
    let result = f()
    let end = DispatchTime.now()
    let time = Double(end.uptimeNanoseconds - start.uptimeNanoseconds) / Double(numBitsInByte * 1000000)
    print("\(readableTime(time)): \(name)")
    return result
}

  1. 在 Xcode 的 Build Phases 中添加一个 Run Script,将以下代码复制到 Run Script 中:
"${PODS_ROOT}/SwiftLint/swiftlint" --no-cache --config "${PODS_ROOT}/SwiftLint/.swiftlint.yml"
"${SRCROOT}/Scripts/perf.swift"

总结

优化项目的编译速度是一个不断迭代的过程,需要不断地寻找和解决问题。本文介绍了如何使用 Swift 代码来找出编译耗时过长的文件,并介绍了三种方法:使用克魔助手、使用 Xcode 控制台和使用 Xcode 插件 SwiftLint。希望这些方法能够帮助读者优化项目的编译速度。

参考资料

  • 克魔助手官网

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1406181.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AJAX入门到实战,学习前端框架前必会的(ajax+node.js+webpack+git)(十)

又是认真学习的一天。 1.Git 初识 2.掌握 Git 仓库 3.Git 的三个区域 git ls-files 查看当前暂存区有哪些文件 4.Git 文件状态 5.Git 暂存区使用 使用git restore命令恢复修改过的index.css 使用git rm --catched命令从暂存区移除index.css文件 再用git add .放回9&#xff08;…

使用 SpringBoot 框架手撸一个本地缓存工具!

在实现本地缓存的时候&#xff0c;我们经常使用线程安全的ConcurrentHashMap来暂存数据&#xff0c;然后加上SpringBoot自带的Scheduled定时刷新缓存。虽然这样可以实现本地缓存&#xff0c;但既不优雅也不安全。 那看一下我的思路&#xff0c;首先看一张图! 1.每个处理器都有…

喷墨打印机市场分析:预计2029年将达到548亿美元

喷墨打印机是将彩色液体油墨经喷嘴变成细小微粒喷到印纸上,有的喷墨打印机有三个或四个打印喷头&#xff0c;以便打印黄、品红青黑四色;有的是共用一个喷头&#xff0c;分四色喷印。 喷墨打印机是在针式打印机之后发展起来的&#xff0c;采用非打击的工作方式。比较突出的优点有…

kubernetes Pod 异常排查步骤

kubernetes Pod 异常排查步骤 详细排查图查看容器状态查看容器列表容器未启动成功排查容器启动成功排查pod状态对应原因 详细排查图 查看容器状态 查看容器列表 查看容器列表,最好在后面跟上命名空间,不跟上查询出来是默认的 kubectl get pods -n kubesphere-system单独查看某…

eNSP学习——理解ARP及Proxy ARP

目录 名词解释 实验内容 实验目的 实验步骤 实验拓扑 配置过程 基础配置 配置静态ARP 名词解释 ARP (Address Resolution Protocol)是用来将IP地址解析为MAC地址的协议。ARP表项可以分为动态和静态两种类型。   动态ARP是利用ARP广播报文&#xff0c;动态执行并自动进…

sprignboot电商书城源码

运行环境: jdk1.8,maven,mysql 项目技术: 后台主要是springbootmybatisshirojsp&#xff0c;前端界面主要使用bootstrap框架搭建&#xff0c;并使用了ueditor富文本编辑器、highcharts图表库。 有需要的可以联系我。 功能介绍&#xff1a; 该系统分为前台展示和后台管理两…

芯课堂 | 通过ISP升级芯片固件方法及框架

一、升级原理 芯片在应用前&#xff0c;是一颗裸片&#xff0c;内部没有任何驱动或应用程序。芯片在贴上PCB板子后&#xff0c;会实现各种功能&#xff0c;这是时候会开发对应的驱动或者应用程序&#xff0c;在芯片上面运行的程序&#xff0c;一般称之为固件&#xff08;Firmw…

低代码,让软件开发不再复杂

低代码一词&#xff0c;有人认为它是第四代编程语言&#xff0c;有人认为它是开发模式的颠覆&#xff0c;也有人认为它是企业管理模式的变革……有很多声音&#xff0c;社区讨论很热烈。 即使这样&#xff0c;至今也有不少人还不知道这项技术&#xff0c;今天笼统的介绍一下低代…

DataStream API(输出算子)

源算子 源算子 转换算子 转换算子 输出算子 1.连接到外部系统 连接外部系统是计算机科学和信息技术领域中常见的一个任务&#xff0c;通常涉及到与外部数据源或服务进行交互。具体的方法和工具会根据不同的应用场景和需求而有所不同。以下是一些常见的连接外部系统的方法&…

BioTech - 量子化学与分子力场

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/135787607 量子化学是应用量子力学的规律和方法来研究化学问题的一门学科&#xff0c;主要关注分子的结构、性质和反应过程。 量子化学的理论方法…

Midjourney基础 | 使用流程 注册,基础文生图,图的放大微调,保存

文章目录 1 使用流程2 生成自己的第一张图3 图的放大&#xff0c;微调3.1 放大3.2 微调变化 4 图的保存 Midjourney是依托于Discord的&#xff0c;但我也是通过Midjourney才了解的Discord 维基百科说~~Discord是一款专为社群设计的免费网络实时通话&#xff0c;主要针对游戏玩家…

Dify学习笔记-手册(三)

1、应用构建及提示词 在 Dify 中&#xff0c;一个“应用”是指基于 GPT 等大型语言模型构建的实际场景应用。通过创建应用&#xff0c;您可以将智能 AI 技术应用于特定的需求。它既包含了开发 AI 应用的工程范式&#xff0c;也包含了具体的交付物。 简而言之&#xff0c;一个应…

【设计模式】美团三面:你连装饰器都举不出例子?

什么是装饰器模式&#xff1f; 装饰器模式&#xff0c;这个设计模式其实和它的名字一样&#xff0c;非常容易理解。 想象一下&#xff0c;每天出门的时候&#xff0c;我们都会思考今天穿什么。睡**衣、睡裤加拖鞋&#xff0c;还是西装、领带加皮鞋&#xff1f;又或者说是&…

获取b站目录

参考链接&#xff1a; JS获取B站视频选集目录 Week6 - 知乎 代码 var x document.getElementsByClassName("clickitem"); var i; for (i 0; i < x.length; i) {var page_num x[i].getElementsByClassName("page-num")[0].innerText;var part x[i…

huggingface学习|云服务器部署Grounded-Segment-Anything:bug总会一个一个一个一个又一个的解决的

文章目录 一、环境部署&#xff08;一&#xff09;模型下载&#xff08;二&#xff09;环境配置&#xff08;三&#xff09;库的安装 二、运行&#xff08;一&#xff09; 运行grounding_dino_demo.py文件&#xff08;二&#xff09;运行grounded_sam_demo.py文件&#xff08;三…

[反转链表] [合并两个有序链表][分割链表]

这里写目录标题 反转链表合并两个有序链表分割链表 反转链表 1、题目&#xff1a; 2.思路  思路1&#xff1a;建立一个newHead,取一个节点进行头插。具体做法如下&#xff01; 建立一个newHead(新头)&#xff0c;由于一个节点里面存的是下一个节点的地址&#xff0c;如果取…

华夏基金“冰火两重天”:产品增量不增值,靠什么赢得用户?

近日&#xff0c;华夏基金发布关于华夏野村日经225交易型开放式指数证券投资基金&#xff08;QDII&#xff09;&#xff08;下称“华夏野村日经ETF”&#xff09;二级市场交易价格溢价风险提示及临时停牌公告。 公告内容显示&#xff0c;华夏野村日经ETF二级市场交易价格明显高…

DFT计算杂谈调查问卷

为更好了解公众号受众对于DFT计算的了解情况以及目标需求&#xff0c;目的以更好更准确并实用地推送给公众号受众所需要的文章&#xff0c;所以本次推送发布调查问卷并收集填写者相关信息。 调查问卷调查内容仅与公众号运营和DFT计算相关&#xff0c;所收集信息仅用作公众号受众…

如何选择和配置适合医院病历管理系统的MySQL版本?

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

7+细胞焦亡+ceRNA+实验验证,如何脱离套路求创新?

导语 今天给同学们分享一篇生信文章“Dissection of pyroptosis-related prognostic signature and CASP6-mediated regulation in pancreatic adenocarcinoma: new sights to clinical decision-making”&#xff0c;这篇文章发表在Apoptosis期刊上&#xff0c;影响因子为7.2。…