成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Go 1.24 已不再建議使用 testing.b.N 開(kāi)發(fā)性能測(cè)試用例

開(kāi)發(fā) 后端
Go1.24 版本引入了一種新的基準(zhǔn)測(cè)試編寫(xiě)方式,它同樣易用,并且可以幫助規(guī)避編寫(xiě)基準(zhǔn)測(cè)試時(shí)的一些坑。

Go 開(kāi)發(fā)者在使用 testing包編寫(xiě)基準(zhǔn)測(cè)試用例時(shí),如果不注意,可能會(huì)遇到各種陷阱。這些陷阱,導(dǎo)致基準(zhǔn)測(cè)試結(jié)果不準(zhǔn)確。Go1.24 版本引入了一種新的基準(zhǔn)測(cè)試編寫(xiě)方式,它同樣易用,并且可以幫助規(guī)避編寫(xiě)基準(zhǔn)測(cè)試時(shí)的一些坑。

Go 1.24 版本推薦使用 testing.B.Loop代替 testing.B.N來(lái)編寫(xiě)基準(zhǔn)測(cè)試用例。

Go1.24 版本前,我們使用 b.N 來(lái)編寫(xiě)基準(zhǔn)測(cè)試用例,例如:

func Benchmark(b *testing.B) {
  for range b.N {
    ... 要測(cè)量的代碼 ...
  }
}

改用b.Loop僅需要微不足道的改動(dòng):

func Benchmark(b *testing.B) {
  for b.Loop() {
    ... 要測(cè)量的代碼 ...
  }
}

testing.B.Loop有很多優(yōu)點(diǎn):

  • 可以防止基準(zhǔn)測(cè)試循環(huán)內(nèi)的不當(dāng)編譯優(yōu)化;
  • 可以自動(dòng)將設(shè)置和清理部分代碼耗時(shí)從基準(zhǔn)測(cè)試時(shí)間統(tǒng)計(jì)中剔除;
  • 代碼不應(yīng)意外地依賴于總迭代次數(shù)或當(dāng)前迭代。

上述這些優(yōu)點(diǎn)都是在使用 b.N編寫(xiě)基準(zhǔn)測(cè)試代碼時(shí)易犯的錯(cuò)誤,這些錯(cuò)誤會(huì)導(dǎo)致基準(zhǔn)測(cè)試不準(zhǔn)確。除了上述優(yōu)點(diǎn)之外,b.Loop風(fēng)格的基準(zhǔn)測(cè)試,還能在更短的時(shí)間執(zhí)行完。

接下來(lái),我們來(lái)看下testing.B.Loop的優(yōu)勢(shì)以及如何有效地使用它。

舊基準(zhǔn)測(cè)試循環(huán)問(wèn)題

在 Go 1.24 之前,大部分的基準(zhǔn)測(cè)試用例結(jié)構(gòu)簡(jiǎn)單。但是復(fù)雜的測(cè)試用例,卻需要很小心的編寫(xiě):

func Benchmark(b *testing.B) {
  ... setup ...
  b.ResetTimer() // 如果設(shè)置可能很昂貴
  for range b.N {
    ... 代碼測(cè)量 ...
    ... 使用匯點(diǎn)或累積防止未用代碼消除 ...
  }
  b.StopTimer() // 如果清理或報(bào)告可能很昂貴
  ... 清理 ...
  ... 報(bào)告 ...
}

如果設(shè)置 (setup)或清理 (cleanup)邏輯復(fù)雜,耗時(shí)較久,為了避免這些準(zhǔn)備性的邏輯參與到核心代碼的耗時(shí)統(tǒng)計(jì)中,需要使用ResetTimer 和 StopTimer 方法,將這些時(shí)間剔除掉。但是真正開(kāi)發(fā)的過(guò)程中, 可能有一些開(kāi)發(fā)者會(huì)遺漏這些邏輯。即使開(kāi)發(fā)者沒(méi)有遺漏,也很難判斷設(shè)置或清理過(guò)程是否“足夠耗時(shí)”到需要使用它們。

還有一個(gè)更微妙的陷阱,需要更深入的理解(示例源代碼):

func isCond(b byte) bool {
  if b%3 == 1 && b%7 == 2 && b%17 == 11 && b%31 == 9 {
    return true
  }
  return false
}

func BenchmarkIsCondWrong(b *testing.B) {
  for range b.N {
    isCond(201)
  }
}

在這個(gè)例子中,用戶可能會(huì)觀察到 isCond 在亞納秒級(jí)別的時(shí)間內(nèi)執(zhí)行。CPU 的速度很快,但并沒(méi)有快到這個(gè)程度!這個(gè)看似異常的結(jié)果源于 isCond 被內(nèi)聯(lián)處理,并且由于其結(jié)果從未被使用,編譯器將其視為無(wú)效代碼而進(jìn)行消除。

因此,這個(gè)基準(zhǔn)測(cè)試根本沒(méi)有測(cè)量 isCond。它測(cè)量的是進(jìn)行無(wú)操作所需的時(shí)間。在這種情況下,亞納秒的結(jié)果是一個(gè)明顯的警示,但在更復(fù)雜的基準(zhǔn)測(cè)試中,部分無(wú)效代碼消除可能導(dǎo)致看起來(lái)合理但實(shí)際上并未測(cè)量預(yù)期內(nèi)容的結(jié)果。

testing.B.Loop可以帶來(lái)哪些好處?

與 b.N 風(fēng)格的基準(zhǔn)測(cè)試不同,testing.B.Loop 能夠跟蹤其首次調(diào)用時(shí)間以及基準(zhǔn)測(cè)試的最終迭代結(jié)束時(shí)刻。循環(huán)開(kāi)始時(shí)的 b.ResetTimer 和結(jié)束時(shí)的 b.StopTimer 被整合進(jìn) testing.B.Loop,消除了手動(dòng)管理基準(zhǔn)測(cè)試計(jì)時(shí)器以進(jìn)行初始化和清理代碼的開(kāi)發(fā)步驟。

另外,Go 編譯器現(xiàn)在可以探測(cè)到只調(diào)用 testing.B.Loop 時(shí)的循環(huán),并阻止 testing.B.Loop 內(nèi)的代碼死循環(huán)。

testing.B.Loop 的另一個(gè)優(yōu)點(diǎn)是其一次性快速提升的方法。對(duì)于 b.N 風(fēng)格的基準(zhǔn)測(cè)試,測(cè)試包必須多次調(diào)用基準(zhǔn)測(cè)試函數(shù),并使用不同的 b.N 值逐步增加,直到測(cè)量時(shí)間達(dá)到一個(gè)閾值。相比之下,b.Loop 可以簡(jiǎn)單地運(yùn)行基準(zhǔn)測(cè)試循環(huán),直到達(dá)到時(shí)間閾值,只需調(diào)用基準(zhǔn)測(cè)試函數(shù)一次。

b.N 風(fēng)格循環(huán)的某些限制仍適用于 b.Loop 風(fēng)格的循環(huán)。用戶仍需在必要時(shí)負(fù)責(zé)在基準(zhǔn)測(cè)試循環(huán)中管理計(jì)時(shí)器。(示例源)

func BenchmarkSortInts(b *testing.B) {
  ints := make([]int, N)
  for b.Loop() {
    b.StopTimer()
    fillRandomInts(ints)
    b.StartTimer()
    slices.Sort(ints)
  }
}

在這個(gè)例子中,為了測(cè)試 slices.Sort 方法的就地排序性能,每次迭代都需要一個(gè)隨機(jī)初始化的數(shù)組。開(kāi)發(fā)菏澤仍需在這些情況下手動(dòng)管理計(jì)時(shí)器。

此外,基準(zhǔn)測(cè)試函數(shù)體中仍需要只有一個(gè)這樣的循環(huán)(b.N風(fēng)格循環(huán)不能與b.Loop風(fēng)格循環(huán)共存),并且循環(huán)的每次迭代應(yīng)該做相同的事情。

何時(shí)使用

testing.B.Loop 方法,是從 Go 1.24 版本起,編寫(xiě)基準(zhǔn)測(cè)試的首選方式。使用示例如下:

func Benchmark(b *testing.B) {
  ... 設(shè)置 ...
  for b.Loop() {
    // 可選的循環(huán)內(nèi)部設(shè)置/清理計(jì)時(shí)器控制
    ... 要測(cè)量的代碼 ...
  }
  ... 清理 ...
}
責(zé)任編輯:趙寧寧 來(lái)源: 令飛編程
相關(guān)推薦

2023-09-11 16:54:17

谷歌開(kāi)發(fā)

2017-11-06 14:33:54

Web開(kāi)發(fā)服務(wù)器網(wǎng)絡(luò)

2010-07-12 17:28:17

SharePointVS 2010

2013-06-24 08:48:55

Unity3D

2011-12-23 17:03:29

性能測(cè)試用例設(shè)計(jì)

2015-05-04 09:48:44

JavaJava開(kāi)發(fā)調(diào)試工具

2009-09-27 14:04:00

Web應(yīng)用開(kāi)發(fā)性能

2013-02-20 13:37:54

Android開(kāi)發(fā)性能

2023-06-09 15:24:50

UiTest接口鴻蒙

2018-09-15 15:07:50

AppleiPhone手機(jī)

2021-03-04 15:43:29

前端測(cè)試工具開(kāi)發(fā)

2019-11-13 14:16:09

Python開(kāi)發(fā)工具

2019-11-14 18:47:06

Python程序員人生第一份工作

2014-05-26 13:26:54

2011-12-01 09:00:12

Android提升開(kāi)發(fā)性能要點(diǎn)

2011-05-16 15:18:18

測(cè)試用例

2011-06-08 17:23:12

測(cè)試用例

2011-05-16 15:09:20

測(cè)試用例

2022-05-10 14:54:13

驗(yàn)收標(biāo)準(zhǔn)測(cè)試用例

2021-12-22 10:19:47

鴻蒙HarmonyOS應(yīng)用
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 亚洲欧洲一区 | 欧美日韩高清在线一区 | 日韩三级一区 | 精品一级电影 | 99re热精品视频 | 久久综合九九 | 精品视频一区二区三区在线观看 | 国产成人精品一区二区三区四区 | 国产精品一区二区日韩 | 欧美激情国产精品 | 日韩精品久久一区二区三区 | 一区二区三区四区日韩 | 九九综合 | 黄色在线免费观看 | 99re在线视频| 亚洲a网 | 欧美日韩在线高清 | 日批免费在线观看 | 亚洲欧洲在线观看视频 | 色视频在线播放 | 91成人免费 | 视频一区在线观看 | 日韩欧美第一页 | av二区三区| 国产免费一区 | 亚洲一区在线日韩在线深爱 | 精品不卡 | 五月天国产 | www日韩| 中文字幕av网| 欧美视频免费在线观看 | 日韩中文字幕一区二区 | 日日操日日干 | 国产精品国产三级国产aⅴ原创 | 亚洲日韩中文字幕一区 | 天天爽天天干 | 国产成人99久久亚洲综合精品 | 黄色毛片在线观看 | 精品国产伦一区二区三区观看说明 | 婷婷中文在线 | 久久精品美女 |