52 lines
1.1 KiB
Go
52 lines
1.1 KiB
Go
package main
|
||
|
||
import (
|
||
"fmt"
|
||
"runtime"
|
||
"sync"
|
||
"time"
|
||
)
|
||
|
||
var globalSum int64
|
||
|
||
// 进一步增加循环次数,单任务耗时延长到10秒以上
|
||
func longCPUTask(id int) {
|
||
localSum := int64(0)
|
||
loopCount := int64(500000000) * int64(id+1) // 循环次数:5e8→2e9(耗时≈10s→40s)
|
||
for j := int64(1); j < loopCount; j++ {
|
||
localSum = (localSum + j*j%987654321) * 1000000007 % 123456789
|
||
if j%100000000 == 0 { // 极低频率写入全局变量,最大化独占P时间
|
||
globalSum = localSum
|
||
}
|
||
}
|
||
}
|
||
|
||
func main() {
|
||
runtime.GOMAXPROCS(1)
|
||
var wg sync.WaitGroup
|
||
startTime := time.Now()
|
||
taskDurations := make([]time.Duration, 4)
|
||
|
||
for i := 0; i < 4; i++ {
|
||
wg.Add(1)
|
||
id := i
|
||
go func() {
|
||
defer wg.Done()
|
||
taskStart := time.Now()
|
||
longCPUTask(id)
|
||
taskDurations[id] = time.Since(taskStart)
|
||
}()
|
||
}
|
||
|
||
wg.Wait()
|
||
totalDuration := time.Since(startTime)
|
||
|
||
fmt.Println("GOMAXPROCS=1")
|
||
sumDurations := time.Duration(0)
|
||
for i := 0; i < 4; i++ {
|
||
fmt.Printf("任务%d 耗时: %v\n", i, taskDurations[i])
|
||
sumDurations += taskDurations[i]
|
||
}
|
||
fmt.Printf("总耗时: %v, 4个任务之和: %v(接近)\n", totalDuration, sumDurations)
|
||
}
|