optimise away the array on single phrase

use sync.Pool to optimise CompressBytesGzip()
This commit is contained in:
Azareal 2020-04-29 10:26:15 +10:00
parent a7773d0ca2
commit ab9dc20c3c
2 changed files with 44 additions and 18 deletions

View File

@ -202,6 +202,7 @@ func (list SFileList) JSTmplInit() error {
//rep("//var plist = GetTmplPhrasesBytes("+shortName+"_tmpl_phrase_id)", "const "+shortName+"_phrase_arr = tmplPhrases[\""+tmplName+"\"];")
rep("//var plist = GetTmplPhrasesBytes("+shortName+"_tmpl_phrase_id)", "const pl=tmplPhrases[\""+tmplName+"\"];")
rep(shortName+"_phrase_arr", "pl")
rep(shortName+"_phrase", "pl")
rep("tmpl_"+shortName+"_vars", "t_v")
rep("var c_v_", "let c_v_")
@ -434,11 +435,20 @@ func (list SFileList) Set(name string, data SFile) {
list[name] = data
}
func CompressBytesGzip(in []byte) ([]byte, error) {
var buff bytes.Buffer
gz, err := gzip.NewWriterLevel(&buff, gzip.BestCompression)
if err != nil {
return nil, err
var gzipBestCompress sync.Pool
func CompressBytesGzip(in []byte) (b []byte, err error) {
var buf bytes.Buffer
ii := gzipBestCompress.Get()
var gz *gzip.Writer
if ii == nil {
gz, err = gzip.NewWriterLevel(&buf, gzip.BestCompression)
if err != nil {
return nil, err
}
} else {
gz = ii.(*gzip.Writer)
gz.Reset(&buf)
}
_, err = gz.Write(in)
if err != nil {
@ -448,7 +458,8 @@ func CompressBytesGzip(in []byte) ([]byte, error) {
if err != nil {
return nil, err
}
return buff.Bytes(), nil
gzipBestCompress.Put(gz)
return buf.Bytes(), nil
}
func CompressBytesBrotli(in []byte) ([]byte, error) {

View File

@ -471,7 +471,11 @@ func (c *CTemplateSet) compile(name, content, expects string, expectsInt interfa
} else if !c.config.SkipInitBlock {
if len(c.langIndexToName) > 0 {
fout += "var " + fname + "_tmpl_phrase_id int\n\n"
fout += "var " + fname + "_phrase_arr [" + strconv.Itoa(len(c.langIndexToName)) + "][]byte\n\n"
if len(c.langIndexToName) > 1 {
fout += "var " + fname + "_phrase_arr [" + strconv.Itoa(len(c.langIndexToName)) + "][]byte\n\n"
} else {
fout += "var " + fname + "_phrase []byte\n\n"
}
}
fout += "// nolint\nfunc init() {\n"
@ -492,10 +496,17 @@ func (c *CTemplateSet) compile(name, content, expects string, expectsInt interfa
}
fout += "\t})\n"
fout += ` phrases.AddTmplIndexCallback(func(phraseSet [][]byte) {
if len(c.langIndexToName) > 1 {
fout += ` phrases.AddTmplIndexCallback(func(phraseSet [][]byte) {
copy(` + fname + `_phrase_arr[:], phraseSet)
})
`
} else {
fout += ` phrases.AddTmplIndexCallback(func(phraseSet [][]byte) {
` + fname + `_phrase = phraseSet[0]
})
`
}
}
fout += "}\n\n"
}
@ -575,7 +586,11 @@ if !ok {
fout += "w.Write(" + fr.Body + ")\n"
case fr.Type == "lang":
//fout += "w.Write(plist[" + strconv.Itoa(fr.Extra.(int)) + "])\n"
fout += "w.Write(" + fname + "_phrase_arr[" + strconv.Itoa(fr.Extra.(int)) + "])\n"
if len(c.langIndexToName) == 1 {
fout += "w.Write(" + fname + "_phrase)\n"
} else {
fout += "w.Write(" + fname + "_phrase_arr[" + strconv.Itoa(fr.Extra.(int)) + "])\n"
}
//case fr.Type == "identifier":
default:
fout += fr.Body
@ -1039,10 +1054,10 @@ func (c *CTemplateSet) compileIdentSwitchN(con CContext, n *parse.CommandNode) (
return out
}
func (c *CTemplateSet) dumpSymbol(pos int, node *parse.CommandNode, symbol string) {
func (c *CTemplateSet) dumpSymbol(pos int, n *parse.CommandNode, symbol string) {
c.detail("symbol:", symbol)
c.detail("node.Args[pos+1]", node.Args[pos+1])
c.detail("node.Args[pos+2]", node.Args[pos+2])
c.detail("n.Args[pos+1]", n.Args[pos+1])
c.detail("n.Args[pos+2]", n.Args[pos+2])
}
func (c *CTemplateSet) compareFunc(con CContext, pos int, n *parse.CommandNode, compare string) (out string) {
@ -1087,8 +1102,8 @@ func (c *CTemplateSet) compareJoin(con CContext, pos int, node *parse.CommandNod
}
out = left + " " + symbol + " " + right
c.detail("Left operand:", node.Args[pos-1])
c.detail("Right operand:", node.Args[pos+1])
c.detail("Left op:", node.Args[pos-1])
c.detail("Right op:", node.Args[pos+1])
if !funcExists {
pos++
}
@ -1671,22 +1686,22 @@ func (c *CTemplateSet) compileVarSub(con CContext, varname string, val reflect.V
if c.guestOnly {
c.detail("optimising away member branch")
if inSlice(userExprs, varname) {
c.detail("positive conditional:", varname)
c.detail("positive condition:", varname)
c.addText(con, []byte("false"))
return
} else if inSlice(negUserExprs, varname) {
c.detail("negative conditional:", varname)
c.detail("negative condition:", varname)
c.addText(con, []byte("true"))
return
}
} else if c.memberOnly {
c.detail("optimising away guest branch")
if (con.RootHolder + ".CurrentUser.Loggedin") == varname {
c.detail("positive conditional:", varname)
c.detail("positive condition:", varname)
c.addText(con, []byte("true"))
return
} else if ("!" + con.RootHolder + ".CurrentUser.Loggedin") == varname {
c.detail("negative conditional:", varname)
c.detail("negative condition:", varname)
c.addText(con, []byte("false"))
return
}