gpt4 book ai didi

mongodb - ObjectID 和字符串版本之间的唯一区别是它更小?

转载 作者:可可西里 更新时间:2023-11-01 10:44:02 28 4
gpt4 key购买 nike

为什么 MongoDB 使用 ObjectID 而不是它的字符串版本?

它的字符串版本(日期、排序等)的一切都是可能的,并且它更容易传输到客户端。只是小了点吗?

感谢您提供任何信息!

最佳答案

我记得有人曾经用字符串编写条件语句,例如 if x == "red"then... 等等。说是更清晰易懂,奇怪的是表现很差。

现在是这样的时代,我认为每个人都应该学习 C 编程,以便他们了解编写程序时幕后发生的事情。

编辑:这些情况下的性能与所比较项目的大小有关。如果你有一个适合单个取指指令的值,CPU 可以在 1 条指令中进行比较,但如果你有需要多次取指的东西,它必须依次比较每一个。现在,如果使用字符串,CPU 必须比较每个字符以查看它们是否完全相同(或者在遇到第一个差异时停止)。这比单一比较要​​慢得多。像 MongoDB 中使用的 ID 值实际上是一个散列(12 字节的散列),在当今的大多数 CPU 上,可以在 1 条指令中比较 64 位值。一切都是关于如何读取内存,以及 CPU 如何处理它。 CPU 最终是非常简单的东西,它们只是非常快速地做一些简单的事情。

Mongo 的散列是 12 字节:不幸的是,它是 96 位,所以它不适合单个 64 位 CPU 值,所以它可以作为 2 次比较结束。这仍然比字符串好得多——即使是 12 字节的字符串也需要 12 次比较,我认为现代 CPU 有 128 位寄存器用于某些比较操作,所以如果 CPU 有正确的 SSE 寄存器,它将是一个无论如何比较操作。

我认为他们选择打包所有这些值是因为他们希望将时间与进程和机器 ID 一起包含在哈希中,以使其在 2 台机器碰巧同时写入时唯一。

同样不幸的是,他们使用 4 个字节作为时间部分,这在 4 字节时间值的 2038 年截止日期之后不会太有用,但它在实际用途中仍然是唯一的。

也许可以进行更快的字符串比较,例如使用 SSE4,但它们要求字符串具有某些限制 - 例如。它们必须正确对齐,长度是 16 字节的倍数,并且不能跨页边界。

关于mongodb - ObjectID 和字符串版本之间的唯一区别是它更小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20924398/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com