swift - Swift - 我应该创建字符串“count”的局部变量吗?
问题描述
如果我在一个函数中多次使用字符串“计数”,这有关系吗?也就是说,Swift 在第一次计算后是否缓存了“计数”。下面是两个例子,我用哪一个有关系吗?我认为第二个肯定没问题,但第一个呢?我总是看到第一个示例代码。
func Foo1 (str: String) {
...
// calling str.count twice
if x < str.count && y < str.count {
...
}
func Foo2 (str: String) {
...
// calling str.count once
let c = str.count
if x < c && y < c {
...
}
解决方案
.count
由Collection
具有以下复杂性的协议定义:
复杂性:如果集合符合 RandomAccessCollection,则为 O(1);否则,O(n),其中 n 是集合的长度。
字符串不是 RandomAccessCollection。这是一个双向集合,所以它不承诺 O(1)。它只承诺 O(n)。
它绝对不承诺任何缓存(你不应该期望任何缓存)。
碰巧在许多(可能是大多数)情况下,String 的计数被缓存。它是 的一部分_StringObject
,是低级存储抽象的一部分,通常由优化器内联。但这一切都没有得到承诺。
也就是说,除非您期望 String 非常大(至少 10kB,可能更多),否则很难想象这是一个主要瓶颈,因为在紧密循环之外被调用两次。与大多数事情一样,您应该写清楚,然后再介绍。为了清楚起见,我可能会创建一个额外的变量,但你不应该在这里过多地猜测。写清楚。然后简介。
您是否正在使用特别大的字符串?
推荐阅读
- python - gRPC Python quickstart/helloworld (greeter_client.py) 在打印“Greeter client received: ...”之前挂起
- git - git lfs 无法正常工作 - 与没有 .gitconfig 文件有关吗?
- c# - 如何在 WPF 上使用 INotifyPropertyChanged 和验证?
- google-apps-script - 数据洞察连接器无法获取 BigQuery 服务帐号的访问令牌:访问未授予或已过期
- vue.js - 需要帮助弄清楚为什么 vue-router 不适用于我的简单选项卡控制场景
- python - 确定两个输入是否彼此相差 10 个整数?
- c# - C# 使用 Entity Framework 6 将 JObject 播种到数据库
- python - 如何解决下载pyautogui库的这个错误?
- javascript - 如何在 v-for 循环中在 vuejs 中采用动态 v-model
- extjs - 发布带有本地化功能的 ext.js 7.2 现代项目