Skip to content

Commit

Permalink
оптимизации
Browse files Browse the repository at this point in the history
  • Loading branch information
LazarenkoA committed Nov 11, 2024
1 parent 967432c commit 61f1222
Show file tree
Hide file tree
Showing 5 changed files with 45 additions and 50 deletions.
20 changes: 0 additions & 20 deletions ast/ast_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1769,26 +1769,6 @@ func BenchmarkString(b *testing.B) {
//})
}

func Benchmark_fastToLower(b *testing.B) {
str := "rdedfs dfdf dsfd rdedfs dfdf dsfdrdedfs dfdf dsfdrdedfs dfdf dsfdrdedfs rdedfs dfdf dsfd rdedfs dfdf dsfdrdedfs dfdf выавквуваы dfdf dsFDRDEDFS DFDF DSFDRDEDFS DFDF DSFD RDEDFS DFDF DSFDRDEDFS DFDF DSFDRDEDFS dfdf dsfdrdedfs dfdf dsfd dfdf dsfd rdedfs dfdf dsfd rdedfs dfdf dsfdrdedfs dfdf dsfdrdedfs dfdf dsfdrdedfs rdedfs dfdf dsfd rdedfs dfdf dsfdrdedfs dfdf выавквуваы dfdf dsFDRDEDFS DFDF DSFDRDEDFS DFDF DSFD RDEDFS DFDF DSFDRDEDFS DFDF DSFDRDEDFS dfdf dsfdrdedfs dfdf dsfd dfdf dsfdrdedfs dfdf dsfd rdedfs dfdf dsfdrdedfs dfdf dsfdrdedfs dfdf dsfdrdedfs rdedfs dfdf dsfd rdedfs dfdf dsfdrdedfs dfdf выавквуваы dfdf dsFDRDEDFS DFDF DSFDRDEDFS DFDF DSFD RDEDFS DFDF DSFDRDEDFS DFDF DSFDRDEDFS dfdf dsfdrdedfs dfdf dsfd dfdf dsfd rdedfs dfdf dsfd rdedfs dfdf dsfdrdedfs dfdf dsfdrdedfs dfdf dsfdrdedfs rdedfs dfdf dsfd rdedfs dfdf dsfdrdedfs dfdf выавквуваы dfdf dsFDRDEDFS DFDF DSFDRDEDFS DFDF DSFD RDEDFS DFDF DSFDRDEDFS DFDF DSFDRDEDFS dfdf dsfdrdedfs dfdf dsfd dfdf dsfdrdedfs dfdf dsfd rdedfs dfdf dsfdrdedfs dfdf dsfdrdedfs dfdf dsfdrdedfs rdedfs dfdf dsfd rdedfs dfdf dsfdrdedfs dfdf выавквуваы dfdf dsFDRDEDFS DFDF DSFDRDEDFS DFDF DSFD RDEDFS DFDF DSFDRDEDFS DFDF DSFDRDEDFS dfdf dsfdrdedfs dfdf dsfd dfdf dsfd rdedfs dfdf dsfd rdedfs dfdf dsfdrdedfs dfdf dsfdrdedfs dfdf dsfdrdedfs rdedfs dfdf dsfd rdedfs dfdf dsfdrdedfs dfdf выавквуваы dfdf dsFDRDEDFS DFDF DSFDRDEDFS DFDF DSFD RDEDFS DFDF DSFDRDEDFS DFDF DSFDRDEDFS dfdf dsfdrdedfs dfdf dsfd dfdf dsfd"

b.Run("sdk", func(b *testing.B) {
for i := 0; i < b.N; i++ {
strings.ToLower(str)
}
})
b.Run("fastToLower", func(b *testing.B) {
for i := 0; i < b.N; i++ {
fastToLower_old(str)
}
})
b.Run("fastToLower", func(b *testing.B) {
for i := 0; i < b.N; i++ {
fastToLower(str)
}
})
}

func test(str string) {

}
Expand Down
35 changes: 19 additions & 16 deletions ast/tokens.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"time"
"unicode"
"unicode/utf8"
"unsafe"
)

//go:generate mockgen -source=$GOFILE -destination=./mock/mock.go
Expand Down Expand Up @@ -133,19 +134,21 @@ func (t *Token) next() (int, string, error) {
} else {
return Identifier, literal, nil
}
case let == '.':
// если после точки у нас следует идентификатор то нам нужно читать его обычным идентификатором
// Могут быть таие случаи стр.Истина = 1 или стр.Функция = 2 (стр в данном случае какой-то объект, например структура)
// нам нужно что бы то что следует после точки считалось Identifier, а не определенным зарезервированным токеном
t.prevDot = true

t.nextPos()
return int(let), string(let), nil
case isDigit(let):
if literal, err := t.scanNumber(); err != nil {
return EOF, emptyLit, err
} else {
return Number, literal, nil
}
case let == '"':
literal, err := t.scanString(let)
if err != nil {
return EOF, emptyLit, err
}

return String, literal, nil
case let == 0x27:
literal, err := t.scanString(let)
if err != nil {
Expand All @@ -158,9 +161,16 @@ func (t *Token) next() (int, string, error) {
}

return Date, literal, nil
case let == '=' || let == '-' || let == '+' || let == '*' || let == '/' || let == '(' || let == '?' || let == ')' || let == '[' || let == ']' || let == ':' || let == ';' || let == ',' || let == '%':
case let == '/' || let == ';' || let == '(' || let == ')' || let == ',' || let == '=' || let == '-' || let == '+' || let == '*' || let == '?' || let == '[' || let == ']' || let == ':' || let == '%':
t.nextPos()
return int(let), string(let), nil
case let == '"':
literal, err := t.scanString(let)
if err != nil {
return EOF, emptyLit, err
}

return String, literal, nil
case let == '<':
if t.nextLet() == '>' {
t.nextPos()
Expand Down Expand Up @@ -189,14 +199,7 @@ func (t *Token) next() (int, string, error) {
// if err != nil {
// return EOF, emptyLit, err
// }
case let == '.':
// если после точки у нас следует идентификатор то нам нужно читать его обычным идентификатором
// Могут быть таие случаи стр.Истина = 1 или стр.Функция = 2 (стр в данном случае какой-то объект, например структура)
// нам нужно что бы то что следует после точки считалось Identifier, а не определенным зарезервированным токеном
t.prevDot = true

t.nextPos()
return int(let), string(let), nil
case let == '&':
t.nextPos()
pos := t.offset
Expand Down Expand Up @@ -229,7 +232,7 @@ func (t *Token) next() (int, string, error) {
}

func (t *Token) scanIdentifier() string {
var ret []rune
ret := make([]rune, 0, 10) // как правило встречаются короткие идентификаторы и лучше предаллоцировать, это сильный буст дает

for {
let := t.currentLet()
Expand Down Expand Up @@ -452,5 +455,5 @@ func fastToLower(s string) string {
}

// Возвращаем строку, преобразованную обратно из среза байт
return string(b)
return *(*string)(unsafe.Pointer(&b))
}
33 changes: 20 additions & 13 deletions ast/tokens_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -376,19 +376,6 @@ func Benchmark(b *testing.B) {
}
})
})
b.Run("toLower", func(b *testing.B) {
str := "АывыввввввввввввввввввввввввввввввсавукавамвамваепмкеккеАа"
b.Run("classic", func(b *testing.B) {
for i := 0; i < b.N; i++ {
strings.ToLower(str)
}
})
b.Run("fastToLower", func(b *testing.B) {
for i := 0; i < b.N; i++ {
fastToLower(str)
}
})
})
b.Run("string concatenation", func(b *testing.B) {
var test string
b.Run("strings.Builder", func(b *testing.B) {
Expand Down Expand Up @@ -517,3 +504,23 @@ func generateRandomString(length int) string {
}
return strings.TrimRight(string(b), "\x00")
}

func Benchmark_fastToLower(b *testing.B) {
str := "ЫСВАМВАОЛОРИИОРОВИЫОРСЫВРООЫОРВЫРОJHDSDHSDSJDDSHЫСВАМВАОЛОРЫСВАМВАОЛОРИИОРОВИЫОРСЫВРООЫОРВЫРОJHDSDHSDSJDDSHDSJHDJSDERKRVEKVJЫСВАМВАОЛОРИЫСВАМВАОЛОРИИОРОВИЫОРСЫВРООЫОРВЫРОJHDSDHSDSJDDSHDSJHDJSDERKRVEKVJЫСВАМВАОЛОРИИОРОВИЫОРСЫВРООЫОРВЫРОJHDSDHSDSJDDSHDSJHDJSDERKRVEKVJЫСВАМВАОЛОРИИОРОВИЫОРСЫВРООЫОРВЫРОJHDSDHSDSJDDSHDSJHDJSDERKRVEKVJЫСВАМВАОЛОРИИОРОВИЫОРСЫВРООЫОРВЫРОJHDSDHSDSJDDSHDSJHDJSDERKRVEKVJЫСВАМВАОЛОРИИОРОВИЫОРСЫВРООЫОРВЫРОJHDSDHSDSJDDSHDSJHDJSDERKRVEKVJЫСВАМВАОЛОРИИОРОВИЫОРСЫВРООЫОРВЫРОJHDSDHSDSJDDSHDSJHDJSDERKRVEKVJЫСВАМВАОЛОРИИОРОВИЫОРСЫВРООЫОРВЫРОJHDSDHSDSJDDSHDSJHDJSDERKRVEKVJИОРОВИЫОРСЫВРООЫОРВЫРОJHDSDHSDSJDDSHDSJHDJSDERKRVEKVJЫСВАМВАОЛОРИИОРОВИЫОРСЫВРООЫОРВЫРОJHDSDHSDSJDDSHDSJHDJSDERKRVEKVJИОРОВИЫОРСЫВРООЫОРВЫРОJHDSDHSDSJDDSHDSJHDJSDERKRVEKVJЫСВАМВАОЛОРИИОРОВИЫОРСЫВРООЫОРВЫРОJHDSDHSDSJDDSHDSJHDJSDERKRVEKVJDSJHDJSDERKRVEKVJ"

b.Run("sdk", func(b *testing.B) {
for i := 0; i < b.N; i++ {
strings.ToLower(str)
}
})
b.Run("fastToLower-old", func(b *testing.B) {
for i := 0; i < b.N; i++ {
fastToLower_old(str)
}
})
b.Run("fastToLower", func(b *testing.B) {
for i := 0; i < b.N; i++ {
fastToLower(str)
}
})
}
5 changes: 4 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
module github.com/LazarenkoA/1c-language-parser

go 1.21.4
go 1.22.4

toolchain go1.23.0

require (
github.com/pkg/errors v0.9.1
Expand All @@ -13,6 +15,7 @@ require (
github.com/matryer/resync v0.0.0-20161211202428-d39c09a11215 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/szampardi/resync v0.0.0-20210519002709-e9d303c16c3c // indirect
github.com/t34-dev/go-field-alignment/v2 v2.0.9 // indirect
golang.org/x/tools v0.17.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
2 changes: 2 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcU
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/szampardi/resync v0.0.0-20210519002709-e9d303c16c3c h1:WhQ4FVNeKbkKfJVS+bwgCh846dFr1Tv217HS6dP7N6Y=
github.com/szampardi/resync v0.0.0-20210519002709-e9d303c16c3c/go.mod h1:KKNsGAJCTeekyAESIynMUDE8npa0N+cCgj+b9FLnTxM=
github.com/t34-dev/go-field-alignment/v2 v2.0.9 h1:aCvX1wyMgk72jfJOYzCuULEI3CTgRuH2aotvA9YT0jM=
github.com/t34-dev/go-field-alignment/v2 v2.0.9/go.mod h1:agY9zYAd61Kza//EhoOijW3aH1eQsw1/R5+LQswpRmc=
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
Expand Down

0 comments on commit 61f1222

Please sign in to comment.