1樓:
你不能用這麼粗暴的用 for 迴圈來測試效能,然後下論斷,
而且你 Golang 和 C# 的版本、執行環境都沒有說,Golang 這幾年提公升很大的。
最後......題主建立 map 的時候都沒有設定 capacity,建議設定一下再看,go 這樣不設定的話挺影響效能的。
2樓:gao xinge
雖說比較語言效能招黑,尤其在場景單一,維度較少的情況下:
測試次數
測試中可控變數
測試用例
機型語言版本
但是涉及到我心愛的go語言,還是手癢跑了一下。
作業系統:windows 10
CPU:i5-6200U
記憶體:8.00GB
go 1.15.6
python 3.6.8
go和python的string都用了intern機制
package
main
import
("fmt"
"reflect"
"unsafe")/*
* type StringHeader struct
*/func
stringPtr(s
string
)uintptr
func
main
()def
main
():dictionary={}
dictionary[0
]="hello"
dictionary[1
]="hello"
print(id
(dictionary[0
]))# 2029239807928
print(id
(dictionary[1
]))# 2029239807928
if__name__
=="__main__"
:main
()go和python的map都會隨著元素的增加而擴容,所以測試不會給go使用
dictionary
:=make
(map
[int
]string
,10000000
)go版本1
package
main
import
("fmt"
"time"
)func
main
()duration
:=time
.Since
(start
)fmt
.Println
(duration
)// 3.6289984s
}python版本1
import
time
defmain
():start
=time
.time
()dictionary={}
fori
inrange
(10000000
):dictionary[i
]="hello"
duration
=time
.time()-
start
(duration
)# 1.6179988384246826
if__name__
=="__main__"
:main
()go版本2
package
main
import
("fmt"
"strconv"
"time"
)func
main
()duration
:=time
.Since
(start
)fmt
.Println
(duration
)// 6.3342451s
}python版本2
import
time
defmain
():start
=time
.time
()dictionary={}
fori
inrange
(10000000
):dictionary[i
]="hello"
+str(i
)duration
=time
.time()-
start
(duration
)# 6.767998933792114
if__name__
=="__main__"
:main
()在版本1中,python比go要快;在版本2中,go比python快一點。
個人猜測:除了go和python在記憶體管理,map實現上不同,還有golang多了runtime的優化,所以在少量資料,簡單測試用例的條件下面,python會比go快。
進一步,可以適當增大迴圈次數。記憶體不夠,此處省略。
go反彙編:go tool compile -S main.go | grep "main.
go" > main.txt 或者 go tool objdump main.o | grep "main.
go" > main.txt
python反彙編:dis - Disassembler for Python bytecode - Python 3.9.4 documentation
反彙編go版本1:
...0x00b8
00184
(main.go
:11)JMP
195// for i := 0; i < 10000000; i++
0x00ba
00186
(main.go
:11)MOVQ"".
i+64(
SP),
CX0x00bf
00191
(main.go
:11)LEAQ1(
CX),
AX0x00c3
00195
(main.go
:11)CMPQAX,
$10000000
0x00c9
00201
(main.go
:11)JGE
2870x00cb
00203
(main.go
:11)MOVQAX,
"".i+
64(SP)
0x00d0
00208(
main.go
:12)LEAQ
type
.map
[int
]string(SB
),CX
// dictionary[i] = "hello"
0x00d7
00215
(main.go
:12)MOVQCX,
(SP)0x00db
00219(
main.go
:12)LEAQ
""..
autotmp_12
+112(SP
),DX
0x00e0
00224
(main.go
:12)MOVQDX,
8(SP)
0x00e5
00229(
main.go
:12)MOVQAX,
16(SP)
0x00ea
00234
(main.go
:12)CALL
runtime
.mapassign_fast64(SB
)0x00ef
00239(
main.go
:12)MOVQ24(
SP),
DI// 主要為了LEAQ go.string."hello"(SB), AX
0x00f4
00244
(main.go
:12)MOVQ$5
,8(DI
)// 但增加了runtime操作,猜測可能是這裡的影響
0x00fc
00252
(main.go
:12)PCDATA$0
,$-2
0x00fc
00252
(main.go
:12)CMPL
runtime
.writeBarrier(SB
),$00x0103
00259(
main.go
:12)JNE
2730x0105
00261
(main.go
:12)LEAQgo.
string
."hello"(SB
),AX
0x010c
00268(
main.go
:12)MOVQAX,
(DI)0x010f
00271
(main.go
:12)JMP
1860x0111
00273
(main.go
:12)LEAQgo.
string
."hello"(SB
),AX
0x0118
00280
(main.go
:12)CALL
runtime
.gcWriteBarrier(SB
)0x011d
00285
(main.go
:12)JMP
186...
3樓:
看發帖時間應該用的是.net core,要是.net5的測試結果就不知道怎樣了。
4樓:
插眼,明天試下一開始就初始化容量是10000000 的map的效能,
眾所周知,golang map擴容還是有一定的效能消耗的,就像問題中的,如果是 [int]*sitting ,效能理論上會提公升,在加上初始化的時候就初始化足夠的容量,效能會進一步提公升.
擦,一開始看走眼以為是 slice了
5樓:lobtao
<?
phpini_set
('memory_limit'
,'1024M'
);$dt_start
=microtime
(true
);$temp=;
for($i=
0;$i<
10000000;$i
++)$dt=
microtime
(true)-
$dt_start
;echo
$dt.
PHP_EOL
;PHP耗時 : 0.22390294075012Go耗時:time used: 1.643043919s是不是吊打Go語言 :), 樓主你來解釋一下
6樓:V刀刃
其實go很多時候需要自己去優化。但是C#的話.net/.net core這些執行平台,巨硬已經優化好了。
所以個人/小團隊能幹過巨頭???
7樓:MaxwellGeng
難道你們比較效能的時候就不能計算一點有意義的東西麼??你寫個軟光柵,算個軟光追比並行效能,可以吧?寫個查詢錶比IO效能可以吧??
整天看貴乎上一堆用誰的for loop速度快來爭執語言快慢的逗比,球球你們了學一下編譯原理吧……絕望.jpg
8樓:Cittie
func
DicWrite1()}
func
DicWrite2()}
func
DicWrite3()}
Benchmark結果
~go test -bench=. -benchmemgoos: darwin
goarch: amd64
pkg: dic
BenchmarkDicWrite1-81 3252565801 ns/op 990789824 B/op 306897 allocs/op
BenchmarkDicWrite2-81 1516403570 ns/op 463470624 B/op 2 allocs/op
BenchmarkDicWrite3-81 1503340830 ns/op 392167456 B/op 2 allocs/op
PASS
ok dic 6.369s
同樣的語言同樣的功能,不同的人來寫,這差距,說實話有點大。
為什麼Go的web框架速度還不如Java?
Function Go為高併發而生從語言級別支援併發,通過 Goroutine 協程來實現程式併發執行,協程是使用者態的輕量級執行緒,Goroutine的排程完全由使用者控制。Goroutine 上下文切換只涉及到PC SP DX三個暫存器值的修改 而執行緒的上下文切換則需要涉及模式切換。Gorou...
為什麼go語言語法要這樣設計呢
linfn golang 的設計者認為這樣在表達複雜型別時具有更好的可讀性禁止隱式型別轉換有助於減少 bug 用 while do while 會增加 golang 的關鍵字,這違背 golang 25 個關鍵的賣點 在 golang 中,i 是乙個語句而不是乙個表示式,區分字首自增和字尾自增沒有意...
為什麼感覺有的老師水平還不如學生?
你只說水平,那這裡就可以是智商 反應速度 理解能力等等。並且和學生相比,也不能是教學水平吧 那這樣的話,你不用感覺,是事實。作為乙個歷史老師,我物理就是個位數水平,基本不如所有學生。而且就本專業而言,也一定有我不甚了解,學生熟悉的歷史事件。更何況,競賽中肯定也有天才學生比指導老師要思維敏捷 反應快。...