Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,5 +30,7 @@
| labs26 | 比较直接调用函数和反射调用函数的效率差别 |
| labs27 | 测试不修改runtime代码的情况下获取goid的效率 |
| labs28 | 测试`[]byte`转`string`的效率 |
| labs29 | 测试不同压缩算法压缩json数据的压缩比和压缩效率。|
| labs30 | 内存数据库事务Demo |
| labs29 | 测试不同压缩算法压缩json数据的压缩比和压缩效率|
| labs30 | 内存数据库事务Demo |
| labs30 | 测试go对象的内存占用情况 |
| labs32 | 测试go对象在多线程环境下的切换时的线程安全及生命周期问题 |
5 changes: 5 additions & 0 deletions labs31/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
测试go对象的内存占用情况。

size of int: 8
size of main.Date: 24
size of [100]main.Date: 2400
16 changes: 16 additions & 0 deletions labs31/labs31.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package main

import "unsafe"
import "fmt"

type Date struct {
Day int
Month int
Year int
}

func main() {
fmt.Printf("size of %T: %v\n", 0, unsafe.Sizeof(0))
fmt.Printf("size of %T: %v\n", Date{}, unsafe.Sizeof(Date{}))
fmt.Printf("size of %T: %v\n", [100]Date{}, unsafe.Sizeof([100]Date{}))
}
8 changes: 8 additions & 0 deletions labs32/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
测试go对象在多线程环境下的切换时的线程安全及生命周期问题。

给定这样一个应用场景:

有一个http server,启动时会使用一个全局的对象来存取一些数据,例如叫`RuleData`,每个请求来的时候会使用(只读)这个`RuleData`。另外,当这个数据有更新时,我们希望该http server能自动更新这个`RuleData`,而又不影响当前的请求。

结论:如果处理得当(例如加锁)是没有问题的。

65 changes: 65 additions & 0 deletions labs32/labs32.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package main

import (
"fmt"
"math/rand"
"sync"
"time"
)

type Date struct {
i1 int
i2 int
i3 int
}

var global *Date
var mutex sync.Mutex

func Update() {
d := new(Date)
d.i1 = time.Now().Nanosecond()
d.i2 = d.i1 + 1
d.i3 = d.i1 + 2
mutex.Lock()
defer mutex.Unlock()
global = d
}

func Get() *Date {
mutex.Lock()
defer mutex.Unlock()
return global
}

func Process(c int, w *sync.WaitGroup) {
d := Get()
for i := 0; i < 10; i++ {
fmt.Printf("c=%d i=%d i1=%d i2=%d i3=%d\n", c, i, d.i1, d.i2, d.i3)
time.Sleep(time.Millisecond * time.Duration(rand.Int()%1000+500))
}
w.Done()
}

func main() {
Update()
var w sync.WaitGroup
go func() {
w.Add(1)
for i := 0; i < 10000; i++ {
Update()
time.Sleep(time.Millisecond * 20)
}
w.Done()
}()

for i := 0; i < 100; i++ {
go Process(i, &w)
w.Add(1)
time.Sleep(time.Millisecond*100)
}



w.Wait()
}