1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- /*
- * Copyright 2021 ByteDance Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- package option
- var (
- // DefaultDecoderBufferSize is the initial buffer size of StreamDecoder
- DefaultDecoderBufferSize uint = 128 * 1024
- // DefaultEncoderBufferSize is the initial buffer size of Encoder
- DefaultEncoderBufferSize uint = 128 * 1024
- )
- // CompileOptions includes all options for encoder or decoder compiler.
- type CompileOptions struct {
- // the maximum depth for compilation inline
- MaxInlineDepth int
- // the loop times for recursively pretouch
- RecursiveDepth int
- }
- var (
- // Default value(3) means the compiler only inline 3 layers of nested struct.
- // when the depth exceeds, the compiler will recurse
- // and compile subsequent structs when they are decoded
- DefaultMaxInlineDepth = 3
- // Default value(1) means `Pretouch()` will be recursively executed once,
- // if any nested struct is left (depth exceeds MaxInlineDepth)
- DefaultRecursiveDepth = 1
- )
- // DefaultCompileOptions set default compile options.
- func DefaultCompileOptions() CompileOptions {
- return CompileOptions{
- RecursiveDepth: DefaultRecursiveDepth,
- MaxInlineDepth: DefaultMaxInlineDepth,
- }
- }
- // CompileOption is a function used to change DefaultCompileOptions.
- type CompileOption func(o *CompileOptions)
- // WithCompileRecursiveDepth sets the loop times of recursive pretouch
- // in both decoder and encoder,
- // for both concrete type and its pointer type.
- //
- // For deep nested struct (depth exceeds MaxInlineDepth),
- // try to set more loops to completely compile,
- // thus reduce JIT unstability in the first hit.
- func WithCompileRecursiveDepth(loop int) CompileOption {
- return func(o *CompileOptions) {
- if loop < 0 {
- panic("loop must be >= 0")
- }
- o.RecursiveDepth = loop
- }
- }
- // WithCompileMaxInlineDepth sets the max depth of inline compile
- // in decoder and encoder.
- //
- // For large nested struct, try to set smaller depth to reduce compiling time.
- func WithCompileMaxInlineDepth(depth int) CompileOption {
- return func(o *CompileOptions) {
- if depth <= 0 {
- panic("depth must be > 0")
- }
- o.MaxInlineDepth = depth
- }
- }
-
|