理解异步记录器中的环形缓冲区

3

在log4j2的异步日志记录器中,官方文档链接

log4j2.asyncLoggerConfigRingBufferSize 的默认值是 256 * 1024

这里的 2561024 表示什么意思?

1个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
4
环形缓冲区中的插槽数量需要是2的幂。这样可以保持递增计数器并使用位掩码而不是模运算从计数器获取数组索引。 例如,假设我们有一个大小为4的环形缓冲区。索引0到3是数组中有效的索引。我们想避免检查index++; if (index > 3) { index = 0; }。在紧密循环中,这个if检查会拖慢速度。我们能避免它吗? 是的,我们可以。我们可以只是递增而不检查,并且当我们从数组中获取值时,我们忽略所有4的倍数(数组的大小)。通常人们使用模运算来实现这一点:value = array[index % 4];
3 % 4 = 3
4 % 4 = 0
5 % 4 = 1
...
这样做是可行的,但我们可以做得更好。模运算适用于任何数组大小,但我们选择2的幂作为数组大小有一个原因:位掩码!位掩码可以实现相同的功能,但速度要快得多(约快25倍)。 这是如何工作的?如果数组是2的幂次方,通过减去1,我们可以得到它的位掩码。然后在从数组中获取值时使用此掩码:value = array[index & mask]; 对于4来说,位掩码是4-1=3。3的二进制表示是11。让我们看一下之前的示例:
0011 & 0011 = 0011 (3 & 3 = 3)
1000 & 0011 = 0000 (4 & 3 = 0)
1001 & 0011 = 0001 (5 & 3 = 1)
...

因此,这与取模的效果相同,但速度更快。再次强调,关键点是数组必须是2的倍数。

回到问题:环形缓冲区中实际插槽的数量为262144。文档说明256 * 1024以澄清它是2的幂。


1
每个插槽的尺寸是多少? - Core_Dumped

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,