Skip to content

Commit 5920b5f

Browse files
committed
Adding task and routines to generate pages faster
1 parent 6ba6d3e commit 5920b5f

File tree

4 files changed

+107
-14
lines changed

4 files changed

+107
-14
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,5 @@ build-linux
2323
build-win
2424
build-macos
2525

26-
dist
26+
dist
27+
nextgen

internal/gstatic/executor.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package gstatic
2+
3+
import (
4+
"fmt"
5+
"time"
6+
)
7+
8+
type elapsedTime struct {
9+
identifier string
10+
start time.Time
11+
end time.Time
12+
}
13+
14+
type worker interface {
15+
execute() error
16+
}
17+
18+
func executor(identifier string, w worker, debug bool) {
19+
var err error
20+
21+
if debug {
22+
enlapsedTime := StartTimer(identifier)
23+
err = w.execute()
24+
EndTimer(enlapsedTime)
25+
} else {
26+
err = w.execute()
27+
}
28+
29+
if err != nil {
30+
fmt.Printf("Something went wrong: %v\n", err.Error())
31+
}
32+
}
33+
34+
func StartTimer(identifier string) elapsedTime {
35+
return elapsedTime{identifier, time.Now(), time.Time{}}
36+
}
37+
38+
func EndTimer(elapsedTime elapsedTime) {
39+
elapsedTime.end = time.Now()
40+
elapsed := elapsedTime.end.Sub(elapsedTime.start)
41+
fmt.Printf("[%s]: %v\n", elapsedTime.identifier, elapsed)
42+
}

internal/gstatic/generator.go

Lines changed: 61 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"os"
66
"path/filepath"
77
"strings"
8+
"sync"
89
)
910

1011
type generator struct {
@@ -13,6 +14,34 @@ type generator struct {
1314
targetPath string
1415
}
1516

17+
type task struct {
18+
generator generator
19+
targetPath string
20+
}
21+
22+
type copyFileWorker task
23+
type layoutRenderWorker task
24+
type simpleRenderWorker task
25+
26+
func (copyFileWorker copyFileWorker) execute() error {
27+
targetAssetname := getTargetDirname(copyFileWorker.generator.sourcePath, copyFileWorker.targetPath)
28+
targetFile := filepath.Join(copyFileWorker.generator.targetPath, targetAssetname)
29+
30+
return copyFile(copyFileWorker.targetPath, targetFile)
31+
}
32+
33+
func (layoutRenderWorker layoutRenderWorker) execute() error {
34+
targetAssetname := getTargetDirname(layoutRenderWorker.generator.sourcePath, layoutRenderWorker.targetPath)
35+
targetFile := filepath.Join(layoutRenderWorker.generator.targetPath, targetAssetname)
36+
tpl := gstaticLayoutTpl{layoutRenderWorker.generator.layoutPath, layoutRenderWorker.targetPath, targetFile}
37+
return tpl.render()
38+
}
39+
40+
func (simpleRenderWorker simpleRenderWorker) execute() error {
41+
tpl := gstaticSimpleTpl{simpleRenderWorker.generator.sourcePath, simpleRenderWorker.generator.targetPath}
42+
return tpl.render()
43+
}
44+
1645
func findLayout(sourcePath string) (string, error) {
1746

1847
sourceFile := filepath.Join(sourcePath, "/layout/layout.html")
@@ -31,19 +60,25 @@ func findLayout(sourcePath string) (string, error) {
3160

3261
func Generate(srcFolder string, targetFolder string) error {
3362

63+
var wg sync.WaitGroup
64+
3465
layoutFile, err := findLayout(srcFolder)
3566
if err != nil {
3667
return fmt.Errorf("[%s] %v", "generate", err)
3768
}
3869

3970
generator := generator{layoutFile, srcFolder, targetFolder}
4071

41-
resolver := resolver(generator)
72+
resolver := resolver(generator, &wg)
73+
74+
err = filepath.Walk(srcFolder, resolver)
75+
wg.Wait()
76+
77+
return err
4278

43-
return filepath.Walk(srcFolder, resolver)
4479
}
4580

46-
func resolver(generator generator) filepath.WalkFunc {
81+
func resolver(generator generator, wg *sync.WaitGroup) filepath.WalkFunc {
4782

4883
useLayout := generator.layoutPath != ""
4984

@@ -83,22 +118,36 @@ func resolver(generator generator) filepath.WalkFunc {
83118

84119
if useLayout {
85120

86-
targetAssetname := getTargetDirname(generator.sourcePath, path)
87-
targetFile := filepath.Join(generator.targetPath, targetAssetname)
88-
tpl := gstaticLayoutTpl{generator.layoutPath, path, targetFile}
89-
return tpl.render()
121+
go func() {
122+
defer wg.Done()
123+
wg.Add(1)
124+
identifier := fmt.Sprintf("layoutRenderWorker: %s", path)
125+
executor(identifier, layoutRenderWorker{generator, path}, false)
126+
}()
127+
128+
return nil
90129

91130
}
92131

93-
tpl := gstaticSimpleTpl{generator.sourcePath, generator.targetPath}
94-
return tpl.render()
132+
go func() {
133+
defer wg.Done()
134+
wg.Add(1)
135+
identifier := fmt.Sprintf("simpleRenderWorker: %s", path)
136+
executor(identifier, simpleRenderWorker{generator, path}, false)
137+
}()
138+
139+
return nil
95140

96141
}
97142

98-
targetAssetname := getTargetDirname(generator.sourcePath, path)
99-
targetFile := filepath.Join(generator.targetPath, targetAssetname)
143+
go func() {
144+
defer wg.Done()
145+
wg.Add(1)
146+
identifier := fmt.Sprintf("copyFileWorker: %s", path)
147+
executor(identifier, copyFileWorker{generator, path}, false)
148+
}()
100149

101-
return copyFile(path, targetFile)
150+
return nil
102151

103152
}
104153

main.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,13 @@ func main() {
1818
srcFolder := argsWithoutProg[0]
1919
targetFolder := argsWithoutProg[1]
2020

21+
elapsedTime := gstatic.StartTimer("gstatic")
2122
err := gstatic.Generate(srcFolder, targetFolder)
2223
if err != nil {
2324
fmt.Fprintf(os.Stderr, "Something went wrong: %v\n", err.Error())
2425
os.Exit(1)
2526
}
26-
27+
gstatic.EndTimer(elapsedTime)
2728
}
2829

2930
func usage() {

0 commit comments

Comments
 (0)