重用 JSONDecoder 或在每个请求上重新创建它?
Posted
技术标签:
【中文标题】重用 JSONDecoder 或在每个请求上重新创建它?【英文标题】:Reusing JSONDecoder or recreating it on every request? 【发布时间】:2019-02-20 13:28:42 【问题描述】:在异步环境中,为所有请求使用一个 JSONDecoder 更有效(如果多个线程正在等待锁定可能会导致延迟)还是为每个新请求创建一个新 JSONDecoder 更有效?
Apple 文档说 JSONDecoder 类是可重用的,但没有进一步详细说明。
https://developer.apple.com/documentation/foundation/jsondecoder
【问题讨论】:
【参考方案1】:On Apple platforms,JSONDecoder 依赖 JSONSerialization 进行初始解析,然后创建一个新的 __JSONDecoder(内部类)来实际进行解码。它传递了一个 _Options,它是一个结构,所以它被复制了。因此,只要您不更改选项(这不是线程安全的),线程之间根本不应该有任何交互。
因此,重用同一个解码器可能会稍微便宜一些,因为它避免了分配和释放类实例,这通常比仅仅保留和释放一个类实例(我希望就是这里的情况)。但我预计与 JSON 解码的更大成本相比,差异会非常非常小。
事实上,如果我遇到这种情况确实值得分析(并且您需要分析它以了解它是否更快),我会问“我到底为什么要解码这么多不同的JSON 消息这么快?”为此,JSON 可能不会来自网络或磁盘(这些速度非常慢,以至于使一个额外的类分配毫无意义)。仅当您在处理大量小消息中已经存在于内存中的 JSON 时才有意义。在这种情况下,答案几乎肯定是“停止使用 JSON 来解决这个问题”。
但我希望在几乎所有情况下,这都无关紧要,而且我绝对不会主动优化它。实现代码中更清晰的那个。然后分析代码以查看您的瓶颈在哪里。
【讨论】:
谢谢!就我而言,这无关紧要,但我只是好奇这是否会产生任何差异。 嗯,您的假设在 ios 开发环境中完全正确。这对于在 OSX 上运行的服务器 Swift 应用程序可能很重要,它需要每秒从客户端输入解码/编码许多 JSON。好吧,这可能不是一个常见的情况,但我想在这种情况下会很重要。你同意吗? @Gabriele 您需要在这些条件下对其进行分析(尽管 macOS 很少用于服务器 Swift;它通常是 Linux)。我会非常担心保留/释放与仅创建新对象的多线程争用,但只有测试会告诉你;当它怀疑时,要简单。然后简介。但作为示例,Kitura 会为每个解析请求生成一个新的 JSONSerialization:github.com/IBM-Swift/Kitura/blob/… 现在,JSONDecoder 使用它自己的解析实现:github.com/apple/swift-corelibs-foundation/blob/main/Sources/…以上是关于重用 JSONDecoder 或在每个请求上重新创建它?的主要内容,如果未能解决你的问题,请参考以下文章
Swift 项目中涉及到 JSONDecoder,网络请求,泛型协议式编程的一些记录和想法
Swift - 使用 JSONDecoder 解码 JSON 数据
通过 DI 注入到 ServiceBusTrigger Azure 函数中的 IHttpClientFactory 是不是为每个触发器重用或重新创建?