為什麼GO語言的效能還不如C

時間 2021-05-31 12:13:03

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

print

(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

print

(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 是乙個語句而不是乙個表示式,區分字首自增和字尾自增沒有意...

為什麼感覺有的老師水平還不如學生?

你只說水平,那這裡就可以是智商 反應速度 理解能力等等。並且和學生相比,也不能是教學水平吧 那這樣的話,你不用感覺,是事實。作為乙個歷史老師,我物理就是個位數水平,基本不如所有學生。而且就本專業而言,也一定有我不甚了解,學生熟悉的歷史事件。更何況,競賽中肯定也有天才學生比指導老師要思維敏捷 反應快。...