Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 理解异步记录器中的环形缓冲区_Java_Logging_Log4j2 - Fatal编程技术网

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

Java 理解异步记录器中的环形缓冲区,java,logging,log4j2,Java,Logging,Log4j2,在log4j2的异步记录器中 log4j2.asyncLoggerConfigRingBufferSize的默认值为256*1024 这里的256和1024代表什么 ringbuffer中的插槽数需要是2的幂。这允许您不断递增计数器,并使用位掩码而不是模从计数器获取数组索引 例如,假设我们有一个大小为4的ringbuffer。索引0到3是数组中的有效索引。我们希望避免检查index++;如果(索引>3){index=0;}。在一个紧密的循环中,这个if检查会减慢速度。我们能避免吗 是的,我们可以

在log4j2的异步记录器中

log4j2.asyncLoggerConfigRingBufferSize的默认值为
256*1024


这里的
256
1024
代表什么

ringbuffer中的插槽数需要是2的幂。这允许您不断递增计数器,并使用位掩码而不是模从计数器获取数组索引

例如,假设我们有一个大小为4的ringbuffer。索引
0
3
是数组中的有效索引。我们希望避免检查
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的倍数


回到问题:ringbuffer中的实际插槽数是
262144
。文档说明了
256*1024
,以澄清这是2的幂。

每个插槽的大小是多少?