首页 > 解决方案 > 重用 JSONDecoder 或在每个请求上重新创建它?

问题描述

在异步环境中,为所有请求使用一个 JSONDecoder 是否更有效(如果多个线程正在等待锁定,可能会导致延迟)还是为每个新请求创建一个新的 JSONDecoder 更有效?

Apple 文档说 JSONDecoder 类是可重用的,但他们没有进一步详细说明。

https://developer.apple.com/documentation/foundation/jsondecoder

标签: iosswiftjsondecoder

解决方案


在 Apple 平台上,JSONDecoder 依赖 JSONSerialization 进行初始解析,然后创建一个新的 __JSONDecoder(内部类)来实际进行解码。它传递了一个 _Options,它是一个结构,所以它被复制了。因此,只要您不更改选项(这不是线程安全的),线程之间就不应该有任何交互。

因此,重用相同的解码器可能会稍微便宜一些,因为它避免了分配和释放类实例,这通常比保留和释放类实例更胜一筹(我希望这里会是这种情况)。但我预计与 JSON 解码的更大成本相比,差异会非常非常小。

事实上,如果我遇到这种情况实际上值得分析(并且您需要分析它以了解它是否更快),我会问“我到底为什么要解码这么多不同的 JSON 消息?迅速地?” 为此,JSON 可能不会来自网络或磁盘(这些速度非常慢,以至于让一个额外的类分配毫无意义)。仅当您在处理大量小消息中已经存在于内存中的 JSON 时才有意义。在这种情况下,答案几乎肯定是“停止使用 JSON 来解决这个问题”。

但我希望在几乎所有情况下,这都无关紧要,我绝对不会主动优化它。实现代码中更清晰的那个。然后分析代码以查看您的瓶颈在哪里。


推荐阅读