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 "+shortName+"_phrase_arr = tmplPhrases[\""+tmplName+"\"];")
rep("//var plist = GetTmplPhrasesBytes("+shortName+"_tmpl_phrase_id)", "const pl=tmplPhrases[\""+tmplName+"\"];") rep("//var plist = GetTmplPhrasesBytes("+shortName+"_tmpl_phrase_id)", "const pl=tmplPhrases[\""+tmplName+"\"];")
rep(shortName+"_phrase_arr", "pl") rep(shortName+"_phrase_arr", "pl")
rep(shortName+"_phrase", "pl")
rep("tmpl_"+shortName+"_vars", "t_v") rep("tmpl_"+shortName+"_vars", "t_v")
rep("var c_v_", "let c_v_") rep("var c_v_", "let c_v_")
@ -434,11 +435,20 @@ func (list SFileList) Set(name string, data SFile) {
list[name] = data list[name] = data
} }
func CompressBytesGzip(in []byte) ([]byte, error) { var gzipBestCompress sync.Pool
var buff bytes.Buffer
gz, err := gzip.NewWriterLevel(&buff, gzip.BestCompression) func CompressBytesGzip(in []byte) (b []byte, err error) {
if err != nil { var buf bytes.Buffer
return nil, err 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) _, err = gz.Write(in)
if err != nil { if err != nil {
@ -448,7 +458,8 @@ func CompressBytesGzip(in []byte) ([]byte, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
return buff.Bytes(), nil gzipBestCompress.Put(gz)
return buf.Bytes(), nil
} }
func CompressBytesBrotli(in []byte) ([]byte, error) { 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 { } else if !c.config.SkipInitBlock {
if len(c.langIndexToName) > 0 { if len(c.langIndexToName) > 0 {
fout += "var " + fname + "_tmpl_phrase_id int\n\n" 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" fout += "// nolint\nfunc init() {\n"
@ -492,10 +496,17 @@ func (c *CTemplateSet) compile(name, content, expects string, expectsInt interfa
} }
fout += "\t})\n" 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) copy(` + fname + `_phrase_arr[:], phraseSet)
}) })
` `
} else {
fout += ` phrases.AddTmplIndexCallback(func(phraseSet [][]byte) {
` + fname + `_phrase = phraseSet[0]
})
`
}
} }
fout += "}\n\n" fout += "}\n\n"
} }
@ -575,7 +586,11 @@ if !ok {
fout += "w.Write(" + fr.Body + ")\n" fout += "w.Write(" + fr.Body + ")\n"
case fr.Type == "lang": case fr.Type == "lang":
//fout += "w.Write(plist[" + strconv.Itoa(fr.Extra.(int)) + "])\n" //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": //case fr.Type == "identifier":
default: default:
fout += fr.Body fout += fr.Body
@ -1039,10 +1054,10 @@ func (c *CTemplateSet) compileIdentSwitchN(con CContext, n *parse.CommandNode) (
return out 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("symbol:", symbol)
c.detail("node.Args[pos+1]", node.Args[pos+1]) c.detail("n.Args[pos+1]", n.Args[pos+1])
c.detail("node.Args[pos+2]", node.Args[pos+2]) 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) { 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 out = left + " " + symbol + " " + right
c.detail("Left operand:", node.Args[pos-1]) c.detail("Left op:", node.Args[pos-1])
c.detail("Right operand:", node.Args[pos+1]) c.detail("Right op:", node.Args[pos+1])
if !funcExists { if !funcExists {
pos++ pos++
} }
@ -1671,22 +1686,22 @@ func (c *CTemplateSet) compileVarSub(con CContext, varname string, val reflect.V
if c.guestOnly { if c.guestOnly {
c.detail("optimising away member branch") c.detail("optimising away member branch")
if inSlice(userExprs, varname) { if inSlice(userExprs, varname) {
c.detail("positive conditional:", varname) c.detail("positive condition:", varname)
c.addText(con, []byte("false")) c.addText(con, []byte("false"))
return return
} else if inSlice(negUserExprs, varname) { } else if inSlice(negUserExprs, varname) {
c.detail("negative conditional:", varname) c.detail("negative condition:", varname)
c.addText(con, []byte("true")) c.addText(con, []byte("true"))
return return
} }
} else if c.memberOnly { } else if c.memberOnly {
c.detail("optimising away guest branch") c.detail("optimising away guest branch")
if (con.RootHolder + ".CurrentUser.Loggedin") == varname { if (con.RootHolder + ".CurrentUser.Loggedin") == varname {
c.detail("positive conditional:", varname) c.detail("positive condition:", varname)
c.addText(con, []byte("true")) c.addText(con, []byte("true"))
return return
} else if ("!" + con.RootHolder + ".CurrentUser.Loggedin") == varname { } else if ("!" + con.RootHolder + ".CurrentUser.Loggedin") == varname {
c.detail("negative conditional:", varname) c.detail("negative condition:", varname)
c.addText(con, []byte("false")) c.addText(con, []byte("false"))
return return
} }