Skip to content

Commit be1e9bb

Browse files
committed
change the implementation of linearGrow
Signed-off-by: FingerLeader <[email protected]>
1 parent afc8a0d commit be1e9bb

File tree

1 file changed

+27
-33
lines changed

1 file changed

+27
-33
lines changed

main.go

Lines changed: 27 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ package main
22

33
import (
44
"flag"
5-
"fmt"
65
"os"
76
"syscall"
87
"time"
8+
99
humanize "github.com/dustin/go-humanize"
1010
)
1111

@@ -20,37 +20,33 @@ func init() {
2020
flag.Parse()
2121
}
2222

23-
func linearGrow(data []byte, interval time.Duration, length uint64, startTime time.Time, timeLine time.Duration) {
24-
fmt.Println(interval)
25-
sysPageSize := os.Getpagesize()
26-
minPageQuantity := int(time.Millisecond * 100 / interval)
27-
pageCount := 0
28-
resLength := length
29-
for i := 0; uint64(i) < length; i += sysPageSize {
30-
data[i] = 1
31-
if minPageQuantity > 0 {
32-
pageCount += 1
33-
acculatedPage := pageCount % minPageQuantity
34-
if acculatedPage == 0 {
35-
time.Sleep(time.Duration(minPageQuantity) * interval)
36-
resLength = length - uint64(i)
37-
interval = updateInterval(timeLine - time.Since(startTime), resLength)
38-
}
23+
func linearGrow(data []byte, length uint64, timeLine time.Duration) {
24+
startTime := time.Now()
25+
endTime := startTime.Add(timeLine)
26+
27+
var allocated uint64 = 0
28+
pageSize := uint64(syscall.Getpagesize())
29+
interval := time.Millisecond * 10
30+
31+
for {
32+
now := time.Now()
33+
if now.After(endTime) {
34+
now = endTime
35+
}
36+
expected := length * uint64(now.Sub(startTime).Milliseconds()) / uint64(endTime.Sub(startTime).Milliseconds()) / pageSize
37+
38+
for i := allocated; uint64(i) < expected; i++ {
39+
data[uint64(i)*pageSize] = 0
40+
}
41+
42+
allocated = expected
43+
if now.Equal(endTime) {
44+
break
3945
} else {
4046
time.Sleep(interval)
4147
}
4248
}
4349

44-
resTime := time.Duration(resLength / uint64(sysPageSize) * uint64(interval))
45-
if resTime > 100 * time.Millisecond {
46-
time.Sleep(resTime)
47-
}
48-
}
49-
50-
func updateInterval(timeLine time.Duration, length uint64) time.Duration {
51-
sysPageSize := uint64(os.Getpagesize())
52-
interval := time.Duration(timeLine) / time.Duration(length / sysPageSize)
53-
return interval
5450
}
5551

5652
func main() {
@@ -71,17 +67,15 @@ func main() {
7167
print(err)
7268
}
7369

74-
sysPageSize := os.Getpagesize()
75-
interval := time.Duration(timeLine) / time.Duration(length / uint64(sysPageSize))
76-
77-
if interval > time.Nanosecond {
78-
linearGrow(data, interval, length, time.Now(), timeLine)
70+
if timeLine > time.Nanosecond {
71+
linearGrow(data, length, timeLine)
7972
} else {
73+
sysPageSize := os.Getpagesize()
8074
for i := 0; uint64(i) < length; i += sysPageSize {
8175
data[i] = 1
8276
}
8377
}
84-
78+
8579
for {
8680
time.Sleep(time.Second * 2)
8781
}

0 commit comments

Comments
 (0)