第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么是數(shù)學。戰(zhàn)俘性能比位移差?

為什么是數(shù)學。戰(zhàn)俘性能比位移差?

Go
慕俠2389804 2022-09-12 16:57:33
在 Exercism 網(wǎng)站上解決此練習時,我使用了標準數(shù)學。Pow包函數(shù)獲得兩個的提升冪。return uint64(math.Pow(2, float64(n-1)))在檢查了社區(qū)解決方案之后,我發(fā)現(xiàn)了一個使用位移來實現(xiàn)相同目標的解決方案:return uint64(1 << uint(n-1)), nil令我驚訝的是,兩者之間有很大的性能差異:位移數(shù)學pow我以為Go編譯器會識別出這種數(shù)學。Pow使用常量2作為基礎(chǔ),并且只是自己使用位移位,而我沒有明確地這樣做。我能看到的唯一其他區(qū)別是 float64 的轉(zhuǎn)換和數(shù)學運算。Pow 在浮點數(shù)上運行,而不是在整數(shù)上運行。為什么編譯器不優(yōu)化電源操作以實現(xiàn)類似于位移位的性能?
查看完整描述

3 回答

?
MYYA

TA貢獻1868條經(jīng)驗 獲得超4個贊

首先,請注意,這是問題中出現(xiàn)的表達式的更好版本。表達式是一個,所以有效的移位值在 0 到 30 或 62 之間,這取決于 int 的大小。 允許在 0 和 63 之間。uint64(1) << (n-1)uint64(1 << uint(n-1))1<<nintuint64(1) << nn


通常,您建議的優(yōu)化不正確。編譯器必須能夠推斷出該值是否在特定范圍內(nèi)。n


請參閱此示例(在操場上)


package main


import (

    "fmt"

    "math"

)


func main() {

    n := 65

    fmt.Println(uint64(math.Pow(2, float64(n-1))))

    fmt.Println(uint64(1) << uint(n-1))

}

輸出表明這兩種方法是不同的:


9223372036854775808

0


查看完整回答
反對 回復 2022-09-12
?
桃花長相依

TA貢獻1860條經(jīng)驗 獲得超8個贊

數(shù)學。Pow() 用于對數(shù)字進行操作。位移位以計算 2 的冪只能應用于整數(shù),并且只能應用于結(jié)果適合(或 )的微小子集。float64int64uint64

如果您有這樣的特殊情況,我們非常歡迎您使用位移位。

結(jié)果大于或基數(shù)不是(或 的冪)的任何其他情況都需要浮點運算。math.MaxInt6422

另請注意,即使將實現(xiàn)對上述可能的微小子集的檢測,結(jié)果也是2的補碼格式,該格式也必須轉(zhuǎn)換為IEEE 754格式,因為返回值為is(盡管這些數(shù)字可以被緩存),您很可能會再次將其轉(zhuǎn)換回。math.Pow()float64int64

同樣:如果需要性能,請使用顯式位移位。


查看完整回答
反對 回復 2022-09-12
?
千萬里不及你

TA貢獻1784條經(jīng)驗 獲得超9個贊

因為這種優(yōu)化從未實施過。

go編譯器旨在實現(xiàn)快速的編譯時間。因此,一些優(yōu)化被認為是不值得的。這節(jié)省了編譯時間,但代價是需要一些運行時。


查看完整回答
反對 回復 2022-09-12
  • 3 回答
  • 0 關(guān)注
  • 107 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號