I am doing a bench for my map-based cache.

the get implementation is the same
// Get an item from the cache. Returns the item or nil, and a bool 
indicating
// whether the key was found.
func (c *cache) Get(k string) (interface{}, bool) {
c.mu.RLock()
// "Inlining" of get and Expired
item, found := c.items[k]
if !found {
c.mu.RUnlock()
return nil, false
}
if item.Expiration > 0 {
if time.Now().UnixNano() > item.Expiration {
c.mu.RUnlock()
return nil, false
}
}
c.mu.RUnlock()
return item.Object, true
}

But value definition is not, cache1 has 

type Item struct {
 Object     interface{}
 Expiration int64
}


and cache2 has
type Item struct {
 Object     int64
 Expiration int64
}


When I do benchmark, there are a lot of runtime.mallogc calls in 
implementation of cache2, which deplay the response.

And I dump the file, i found cache1 has no newobject called between RLock 
and mapaccess2_faststr, but cache2 implementation has a newobject called 
which calls runtime.mallocgc. 

Why runtime.newobject is missing in map access ?


This is cache2 objfump
cache.go:111 0x71ec0 65488b0c25a0080000 GS MOVQ GS:0x8a0, CX
cache.go:111 0x71ec9 483b6110 CMPQ 0x10(CX), SP
cache.go:111 0x71ecd 0f863c010000 JBE 0x7200f
cache.go:111 0x71ed3 4883ec48 SUBQ $0x48, SP
cache.go:111 0x71ed7 48896c2440 MOVQ BP, 0x40(SP)
cache.go:111 0x71edc 488d6c2440 LEAQ 0x40(SP), BP
cache.go:112 0x71ee1 488b442450 MOVQ 0x50(SP), AX
cache.go:112 0x71ee6 8400 TESTB AL, 0(AX)
cache.go:112 0x71ee8 488d4810 LEAQ 0x10(AX), CX
cache.go:112 0x71eec 48894c2430 MOVQ CX, 0x30(SP)
cache.go:112 0x71ef1 48890c24 MOVQ CX, 0(SP)
cache.go:112 0x71ef5 e8564b0100 CALL sync.(*RWMutex).RLock(SB)
cache.go:114 0x71efa 488d053fed0900 LEAQ 0x9ed3f(IP), AX
cache.go:114 0x71f01 48890424 MOVQ AX, 0(SP)
cache.go:114 0x71f05 e816e5f9ff CALL runtime.newobject(SB)
cache.go:114 0x71f0a 488b442408 MOVQ 0x8(SP), AX
cache.go:114 0x71f0f 4889442438 MOVQ AX, 0x38(SP)
cache.go:114 0x71f14 488d0dc54f0900 LEAQ 0x94fc5(IP), CX
cache.go:114 0x71f1b 48890c24 MOVQ CX, 0(SP)
cache.go:114 0x71f1f 488b4c2450 MOVQ 0x50(SP), CX
cache.go:114 0x71f24 488b5108 MOVQ 0x8(CX), DX
cache.go:114 0x71f28 4889542408 MOVQ DX, 0x8(SP)
cache.go:114 0x71f2d 488b542458 MOVQ 0x58(SP), DX
cache.go:114 0x71f32 4889542410 MOVQ DX, 0x10(SP)
cache.go:114 0x71f37 488b542460 MOVQ 0x60(SP), DX
cache.go:114 0x71f3c 4889542418 MOVQ DX, 0x18(SP)
cache.go:114 0x71f41 e88aa0f9ff CALL runtime.mapaccess2_faststr(SB)
cache.go:114 0x71f46 488b442420 MOVQ 0x20(SP), AX
cache.go:114 0x71f4b 0fb64c2428 MOVZX 0x28(SP), CX
cache.go:114 0x71f50 488b5008 MOVQ 0x8(AX), DX
cache.go:114 0x71f54 488b00 MOVQ 0(AX), AX
cache.go:114 0x71f57 488b5c2438 MOVQ 0x38(SP), BX
cache.go:114 0x71f5c 488903 MOVQ AX, 0(BX)
cache.go:114 0x71f5f 48895308 MOVQ DX, 0x8(BX)
cache.go:114 0x71f63 84c9 TESTL CL, CL
cache.go:115 0x71f65 0f8483000000 JE 0x71fee
cache.go:119 0x71f6b 4885d2 TESTQ DX, DX
cache.go:119 0x71f6e 7f22 JG 0x71f92
cache.go:125 0x71f70 488b442430 MOVQ 0x30(SP), AX
cache.go:125 0x71f75 48890424 MOVQ AX, 0(SP)
cache.go:125 0x71f79 e8424b0100 CALL sync.(*RWMutex).RUnlock(SB)
cache.go:126 0x71f7e 488b442438 MOVQ 0x38(SP), AX
cache.go:126 0x71f83 4889442468 MOVQ AX, 0x68(SP)
cache.go:126 0x71f88 488b6c2440 MOVQ 0x40(SP), BP
cache.go:126 0x71f8d 4883c448 ADDQ $0x48, SP
cache.go:126 0x71f91 c3 RET
cache.go:120 0x71f92 e839f90000 CALL time.Now(SB)
cache.go:120 0x71f97 488b0424 MOVQ 0(SP), AX
cache.go:120 0x71f9b 4869c000ca9a3b IMULQ $0x3b9aca00, AX, AX
cache.go:120 0x71fa2 48b900001a3deb03b2a1 MOVQ $0xa1b203eb3d1a0000, CX
cache.go:120 0x71fac 4801c8 ADDQ CX, AX
cache.go:120 0x71faf 488d4c2408 LEAQ 0x8(SP), CX
cache.go:120 0x71fb4 486309 MOVSXD 0(CX), CX
cache.go:120 0x71fb7 4801c8 ADDQ CX, AX
cache.go:120 0x71fba 488b4c2438 MOVQ 0x38(SP), CX
cache.go:120 0x71fbf 488b5108 MOVQ 0x8(CX), DX
cache.go:120 0x71fc3 4839d0 CMPQ DX, AX
cache.go:120 0x71fc6 7f05 JG 0x71fcd
cache.go:120 0x71fc8 4889cb MOVQ CX, BX
cache.go:125 0x71fcb eba3 JMP 0x71f70
cache.go:121 0x71fcd 488b442430 MOVQ 0x30(SP), AX
cache.go:121 0x71fd2 48890424 MOVQ AX, 0(SP)
cache.go:121 0x71fd6 e8e54a0100 CALL sync.(*RWMutex).RUnlock(SB)
cache.go:122 0x71fdb 48c744246800000000 MOVQ $0x0, 0x68(SP)
cache.go:122 0x71fe4 488b6c2440 MOVQ 0x40(SP), BP
cache.go:122 0x71fe9 4883c448 ADDQ $0x48, SP
cache.go:122 0x71fed c3 RET
cache.go:116 0x71fee 488b442430 MOVQ 0x30(SP), AX
cache.go:116 0x71ff3 48890424 MOVQ AX, 0(SP)
cache.go:116 0x71ff7 e8c44a0100 CALL sync.(*RWMutex).RUnlock(SB)
cache.go:117 0x71ffc 48c744246800000000 MOVQ $0x0, 0x68(SP)
cache.go:117 0x72005 488b6c2440 MOVQ 0x40(SP), BP
cache.go:117 0x7200a 4883c448 ADDQ $0x48, SP
cache.go:117 0x7200e c3 RET
cache.go:111 0x7200f e85c51feff CALL runtime.morestack_noctxt(SB)
cache.go:111 0x72014 e9a7feffff JMP 
github.com/ggaaooppeenngg/cachemap.(*cache).Get(SB)
:-1 0x72019 cc INT $0x3
:-1 0x7201a cc INT $0x3
:-1 0x7201b cc INT $0x3
:-1 0x7201c cc INT $0x3
:-1 0x7201d cc INT $0x3
:-1 0x7201e cc INT $0x3
:-1 0x7201f cc INT $0x3



This is cache1 objdump
cache.go:114 0x72690 65488b0c25a0080000 GS MOVQ GS:0x8a0, CX
cache.go:114 0x72699 483b6110 CMPQ 0x10(CX), SP
cache.go:114 0x7269d 0f8669010000 JBE 0x7280c
cache.go:114 0x726a3 4883ec58 SUBQ $0x58, SP
cache.go:114 0x726a7 48896c2450 MOVQ BP, 0x50(SP)
cache.go:114 0x726ac 488d6c2450 LEAQ 0x50(SP), BP
cache.go:115 0x726b1 488b442460 MOVQ 0x60(SP), AX
cache.go:115 0x726b6 8400 TESTB AL, 0(AX)
cache.go:115 0x726b8 488d4810 LEAQ 0x10(AX), CX
cache.go:115 0x726bc 48894c2448 MOVQ CX, 0x48(SP)
cache.go:115 0x726c1 48890c24 MOVQ CX, 0(SP)
cache.go:115 0x726c5 e8f6970300 CALL sync.(*RWMutex).RLock(SB)
cache.go:117 0x726ca 488d058f590e00 LEAQ 0xe598f(IP), AX
cache.go:117 0x726d1 48890424 MOVQ AX, 0(SP)
cache.go:117 0x726d5 488b442460 MOVQ 0x60(SP), AX
cache.go:117 0x726da 488b4808 MOVQ 0x8(AX), CX
cache.go:117 0x726de 48894c2408 MOVQ CX, 0x8(SP)
cache.go:117 0x726e3 488b4c2468 MOVQ 0x68(SP), CX
cache.go:117 0x726e8 48894c2410 MOVQ CX, 0x10(SP)
cache.go:117 0x726ed 488b4c2470 MOVQ 0x70(SP), CX
cache.go:117 0x726f2 48894c2418 MOVQ CX, 0x18(SP)
cache.go:117 0x726f7 e8949af9ff CALL runtime.mapaccess2_faststr(SB)
cache.go:117 0x726fc 488b442420 MOVQ 0x20(SP), AX
cache.go:117 0x72701 0fb64c2428 MOVZX 0x28(SP), CX
cache.go:117 0x72706 488b5010 MOVQ 0x10(AX), DX
cache.go:117 0x7270a 4889542430 MOVQ DX, 0x30(SP)
cache.go:117 0x7270f 488b18 MOVQ 0(AX), BX
cache.go:117 0x72712 48895c2438 MOVQ BX, 0x38(SP)
cache.go:117 0x72717 488b4008 MOVQ 0x8(AX), AX
cache.go:117 0x7271b 4889442440 MOVQ AX, 0x40(SP)
cache.go:117 0x72720 84c9 TESTL CL, CL
cache.go:118 0x72722 0f84af000000 JE 0x727d7
cache.go:122 0x72728 4885d2 TESTQ DX, DX
cache.go:122 0x7272b 7f37 JG 0x72764
cache.go:128 0x7272d 488b4c2448 MOVQ 0x48(SP), CX
cache.go:128 0x72732 48890c24 MOVQ CX, 0(SP)
cache.go:128 0x72736 e8f5970300 CALL sync.(*RWMutex).RUnlock(SB)
cache.go:129 0x7273b 488b442438 MOVQ 0x38(SP), AX
cache.go:129 0x72740 4889442478 MOVQ AX, 0x78(SP)
cache.go:129 0x72745 488b442440 MOVQ 0x40(SP), AX
cache.go:129 0x7274a 4889842480000000 MOVQ AX, 0x80(SP)
cache.go:129 0x72752 c684248800000001 MOVB $0x1, 0x88(SP)
cache.go:129 0x7275a 488b6c2450 MOVQ 0x50(SP), BP
cache.go:129 0x7275f 4883c458 ADDQ $0x58, SP
cache.go:129 0x72763 c3 RET
cache.go:123 0x72764 e867270300 CALL time.Now(SB)
cache.go:123 0x72769 488d442408 LEAQ 0x8(SP), AX
cache.go:123 0x7276e 486300 MOVSXD 0(AX), AX
cache.go:123 0x72771 488b0c24 MOVQ 0(SP), CX
cache.go:123 0x72775 4869c900ca9a3b IMULQ $0x3b9aca00, CX, CX
cache.go:123 0x7277c 48ba00001a3deb03b2a1 MOVQ $0xa1b203eb3d1a0000, DX
cache.go:123 0x72786 4801d1 ADDQ DX, CX
cache.go:123 0x72789 4801c8 ADDQ CX, AX
cache.go:123 0x7278c 488b4c2430 MOVQ 0x30(SP), CX
cache.go:123 0x72791 4839c8 CMPQ CX, AX
cache.go:123 0x72794 7f0c JG 0x727a2
cache.go:117 0x72796 488b442440 MOVQ 0x40(SP), AX
cache.go:117 0x7279b 488b5c2438 MOVQ 0x38(SP), BX
cache.go:128 0x727a0 eb8b JMP 0x7272d
cache.go:124 0x727a2 488b442448 MOVQ 0x48(SP), AX
cache.go:124 0x727a7 48890424 MOVQ AX, 0(SP)
cache.go:124 0x727ab e880970300 CALL sync.(*RWMutex).RUnlock(SB)
cache.go:125 0x727b0 48c744247800000000 MOVQ $0x0, 0x78(SP)
cache.go:125 0x727b9 48c784248000000000000000 MOVQ $0x0, 0x80(SP)
cache.go:125 0x727c5 c684248800000000 MOVB $0x0, 0x88(SP)
cache.go:125 0x727cd 488b6c2450 MOVQ 0x50(SP), BP
cache.go:125 0x727d2 4883c458 ADDQ $0x58, SP
cache.go:125 0x727d6 c3 RET
cache.go:119 0x727d7 488b442448 MOVQ 0x48(SP), AX
cache.go:119 0x727dc 48890424 MOVQ AX, 0(SP)
cache.go:119 0x727e0 e84b970300 CALL sync.(*RWMutex).RUnlock(SB)
cache.go:120 0x727e5 48c744247800000000 MOVQ $0x0, 0x78(SP)
cache.go:120 0x727ee 48c784248000000000000000 MOVQ $0x0, 0x80(SP)
cache.go:120 0x727fa c684248800000000 MOVB $0x0, 0x88(SP)
cache.go:120 0x72802 488b6c2450 MOVQ 0x50(SP), BP
cache.go:120 0x72807 4883c458 ADDQ $0x58, SP
cache.go:120 0x7280b c3 RET
cache.go:114 0x7280c e83f4dfeff CALL runtime.morestack_noctxt(SB)
cache.go:114 0x72811 e97afeffff JMP 
github.com/patrickmn/go-cache.(*cache).Get(SB)
:-1 0x72816 cc INT $0x3
:-1 0x72817 cc INT $0x3
:-1 0x72818 cc INT $0x3
:-1 0x72819 cc INT $0x3
:-1 0x7281a cc INT $0x3
:-1 0x7281b cc INT $0x3
:-1 0x7281c cc INT $0x3
:-1 0x7281d cc INT $0x3
:-1 0x7281e cc INT $0x3
:-1 0x7281f cc INT $0x3



-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to