gtsocial-umbx

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

option.go (2817B)


      1 /*
      2  * Copyright 2021 ByteDance Inc.
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *     http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package option
     18 
     19 var (
     20     // DefaultDecoderBufferSize is the initial buffer size of StreamDecoder
     21     DefaultDecoderBufferSize  uint = 128 * 1024
     22 
     23     // DefaultEncoderBufferSize is the initial buffer size of Encoder
     24     DefaultEncoderBufferSize  uint = 128 * 1024
     25 )
     26 
     27 // CompileOptions includes all options for encoder or decoder compiler.
     28 type CompileOptions struct {
     29     // the maximum depth for compilation inline
     30     MaxInlineDepth int
     31 
     32     // the loop times for recursively pretouch
     33     RecursiveDepth int
     34 }
     35 
     36 var (
     37     // Default value(3) means the compiler only inline 3 layers of nested struct. 
     38     // when the depth exceeds, the compiler will recurse 
     39     // and compile subsequent structs when they are decoded 
     40     DefaultMaxInlineDepth = 3
     41 
     42     // Default value(1) means `Pretouch()` will be recursively executed once,
     43     // if any nested struct is left (depth exceeds MaxInlineDepth)
     44     DefaultRecursiveDepth = 1
     45 )
     46 
     47 // DefaultCompileOptions set default compile options.
     48 func DefaultCompileOptions() CompileOptions {
     49     return CompileOptions{
     50         RecursiveDepth: DefaultRecursiveDepth,
     51         MaxInlineDepth: DefaultMaxInlineDepth,
     52     }
     53 }
     54 
     55 // CompileOption is a function used to change DefaultCompileOptions.
     56 type CompileOption func(o *CompileOptions)
     57 
     58 // WithCompileRecursiveDepth sets the loop times of recursive pretouch 
     59 // in both decoder and encoder,
     60 // for both concrete type and its pointer type.
     61 //
     62 // For deep nested struct (depth exceeds MaxInlineDepth), 
     63 // try to set more loops to completely compile, 
     64 // thus reduce JIT unstability in the first hit.
     65 func WithCompileRecursiveDepth(loop int) CompileOption {
     66     return func(o *CompileOptions) {
     67             if loop < 0 {
     68                 panic("loop must be >= 0")
     69             }
     70             o.RecursiveDepth = loop
     71         }
     72 }
     73 
     74 // WithCompileMaxInlineDepth sets the max depth of inline compile 
     75 // in decoder and encoder.
     76 //
     77 // For large nested struct, try to set smaller depth to reduce compiling time.
     78 func WithCompileMaxInlineDepth(depth int) CompileOption {
     79     return func(o *CompileOptions) {
     80             if depth <= 0 {
     81                 panic("depth must be > 0")
     82             }
     83             o.MaxInlineDepth = depth
     84         }
     85 }
     86