Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 19601] ファイルの概要

このコミットは、Go言語の標準ライブラリtestingパッケージにおけるベンチマーク実行の効率を改善することを目的としています。具体的には、ベンチマークの実行時間を短縮するために、必要なイテレーション数の見積もり方法と、その見積もりを「読みやすい」数値に丸めるロジックを調整しています。これにより、ベンチマークが過剰に実行されることを防ぎ、全体的なテスト時間を削減します。

コミット

commit a12cc7198072f2f02599d3c640807b97f748ddc6
Author: Josh Bleecher Snyder <josharian@gmail.com>
Date:   Tue Jun 24 08:39:30 2014 -0700

    testing: make benchmarking faster
    
    The number of estimated iterations required to reach the benchtime is multiplied by a safety margin (to avoid falling just short) and then rounded up to a readable number. With an accurate estimate, in the worse case, the resulting number of iterations could be 3.75x more than necessary: 1.5x for safety * 2.5x to round up (e.g. from 2eX+1 to 5eX).
    
    This CL reduces the safety margin to 1.2x. Experimentation showed a diminishing margin of return past 1.2x, although the average case continued to show improvements down to 1.05x.
    
    This CL also reduces the maximum round-up multiplier from 2.5x (from 2eX+1 to 5eX) to 2x, by allowing the number of iterations to be of the form 3eX.
    
    Both changes improve benchmark wall clock times, and the effects are cumulative.
    
    From 1.5x to 1.2x safety margin:
    
    package         old s   new s   delta
    bytes           163     125     -23%
    encoding/json   27      21      -22%
    net/http        42      36      -14%
    runtime         463     418     -10%
    strings         82      65      -21%
    
    Allowing 3eX iterations:
    
    package         old s   new s   delta
    bytes           163     134     -18%
    encoding/json   27      23      -15%
    net/http        42      36      -14%
    runtime         463     422     -9%
    strings         82      72      -12%
    
    Combined:
    
    package         old s   new s   delta
    bytes           163     112     -31%
    encoding/json   27      20      -26%
    net/http        42      30      -29%
    runtime         463     346     -25%
    strings         82      60      -27%
    
    LGTM=crawshaw, r, rsc
    R=golang-codereviews, crawshaw, r, rsc
    CC=golang-codereviews
    https://golang.org/cl/105990045

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/a12cc7198072f2f02599d3c640807b97f748ddc6

元コミット内容

Goのベンチマークシステムは、指定されたbenchtime(デフォルトでは1秒)に達するまで、ベンチマーク関数を繰り返し実行します。この際、システムは必要なイテレーション数を推定し、その推定値に「安全マージン」を乗じ、さらに「読みやすい」数値に丸めることで、ベンチマークが目標時間を確実に満たすようにしていました。

しかし、このアプローチには非効率性がありました。元の実装では、安全マージンが1.5倍、そして丸め処理が最大2.5倍(例: 2eX+1から5eXへの丸め)の乗数を持つ可能性がありました。最悪の場合、これにより必要なイテレーション数が最大で3.75倍(1.5倍 * 2.5倍)も多くなる可能性があり、結果としてベンチマークの実行時間が不必要に長くなっていました。

変更の背景

Goのベンチマークは、コードのパフォーマンス特性を測定するために不可欠なツールです。しかし、ベンチマークの実行に時間がかかりすぎると、開発サイクルが遅延し、CI/CDパイプラインの効率が低下します。特に、大規模なプロジェクトや多数のベンチマークを持つプロジェクトでは、この問題が顕著になります。

このコミットの目的は、ベンチマークの精度を維持しつつ、その実行時間を短縮することにありました。過剰なイテレーションは、正確な測定には寄与せず、単にCPU時間とウォールクロック時間を浪費するだけです。そのため、安全マージンと丸めロジックを見直すことで、ベンチマークのオーバーヘッドを削減し、開発者の生産性向上に貢献することが求められました。

前提知識の解説

このコミットを理解するためには、Go言語のベンチマークの仕組みと、一般的なベンチマーク測定における考慮事項について知っておく必要があります。

  • Go言語のベンチマーク (go test -bench): Goのtestingパッケージは、BenchmarkXxxという形式の関数を定義することで、コードのパフォーマンスを測定する機能を提供します。go test -bench .コマンドを実行すると、これらのベンチマーク関数が実行されます。 ベンチマークは、指定された時間(benchtime、デフォルト1秒)に達するまで、ベンチマーク関数を繰り返し実行します。この繰り返し回数を「イテレーション数」と呼びます。 最終的に、N回のイテレーションを実行するのにかかった時間Tから、1イテレーションあたりの平均実行時間(T/N、通常はナノ秒/操作 ns/op)が計算され、表示されます。

  • イテレーション数の推定と調整: ベンチマークシステムは、最初の数回の実行結果に基づいて、目標のbenchtimeに達するために必要なイテレーション数を推定します。 この推定値は、測定の安定性を確保するために、いくつかの調整が加えられます。

    • 安全マージン (Safety Margin): 推定されたイテレーション数では目標時間にわずかに届かない可能性を考慮し、少し多めにイテレーションを実行するための乗数です。これにより、ベンチマークが目標時間を下回ることを防ぎます。
    • 丸め処理 (Rounding Up): 計算されたイテレーション数を、人間が読みやすい、またはシステムが扱いやすい「きれいな」数値(例: 1000, 2000, 5000, 10000など)に丸める処理です。これは、ベンチマーク結果の表示を整える目的もあります。
  • ウォールクロック時間 (Wall Clock Time): プログラムの実行開始から終了までの実時間のことです。CPU時間とは異なり、I/O待ちや他のプロセスの実行時間なども含まれます。ベンチマークの「速さ」を測る上で重要な指標です。

技術的詳細

このコミットは、主にsrc/pkg/testing/benchmark.go内の2つの主要なロジックを変更することで、ベンチマークの高速化を実現しています。

  1. 安全マージンの削減: launch関数内で、次のイテレーション数を決定する際に使用される安全マージンが1.5xから1.2xに削減されました。 元のコードでは、n = max(min(n+n/2, 100*last), last+1)という計算が行われていました。ここでn+n/2n * 1.5に相当します。 変更後、この部分はn = max(min(n+n/5, 100*last), last+1)となり、n+n/5n * 1.2に相当します。 この変更により、推定されたイテレーション数に対して、不必要に多くのイテレーションが追加されることが減り、ベンチマークの実行時間が短縮されます。コミットメッセージのデータが示すように、この変更単独でも各パッケージで10%〜23%の改善が見られました。

  2. roundUp関数の改善(3eX形式の追加): roundUp関数は、イテレーション数を1eX, 2eX, 5eXの形式に丸めていました。例えば、1400は2000に、4999は5000に丸められます。 このコミットでは、新たに3eXの形式(例: 3000, 30000など)が丸め対象に追加されました。 具体的には、roundUp関数内のswitch文にcase n <= (3 * base): return 3 * baseという条件が追加されました。 これにより、例えば2700のような値が以前は5000に丸められていたものが、3000に丸められるようになります。 この変更は、丸めによるイテレーション数の増加を最大2.5倍から最大2倍に削減します。これにより、丸め処理による過剰なイテレーションが減り、ベンチマークの実行時間がさらに短縮されます。コミットメッセージのデータが示すように、この変更単独でも各パッケージで9%〜18%の改善が見られました。

これらの変更は相乗効果をもたらし、両方を適用することで、ベンチマークのウォールクロック時間が大幅に短縮されることが示されています(例: bytesパッケージで31%減、runtimeパッケージで25%減)。

コアとなるコードの変更箇所

src/pkg/testing/benchmark.go

--- a/src/pkg/testing/benchmark.go
+++ b/src/pkg/testing/benchmark.go
@@ -157,7 +157,7 @@ func roundDown10(n int) int {
 	return result
 }
 
-// roundUp rounds x up to a number of the form [1eX, 2eX, 5eX].
+// roundUp rounds x up to a number of the form [1eX, 2eX, 3eX, 5eX].
 func roundUp(n int) int {
 	base := roundDown10(n)
 	switch {
@@ -165,6 +165,8 @@ func roundUp(n int) int {
 		return base
 	case n <= (2 * base):
 		return 2 * base
+	case n <= (3 * base):
+		return 3 * base
 	case n <= (5 * base):
 		return 5 * base
 	default:
@@ -180,10 +182,10 @@ func (b *B) run() BenchmarkResult {
 }
 
 // launch launches the benchmark function.  It gradually increases the number
-// of benchmark iterations until the benchmark runs for a second in order
-// to get a reasonable measurement.  It prints timing information in this form
+// of benchmark iterations until the benchmark runs for the requested benchtime.
+// It prints timing information in this form
 //		testing.BenchmarkHello	100000		19 ns/op
-// launch is run by the fun function as a separate goroutine.
+// launch is run by the run function as a separate goroutine.
 func (b *B) launch() {
 	// Run the benchmark for a single iteration in case it's expensive.
 	n := 1
@@ -199,16 +201,16 @@ func (b *B) launch() {
 	d := *benchTime
 	for !b.failed && b.duration < d && n < 1e9 {
 		last := n
-		// Predict iterations/sec.
+		// Predict required iterations.
 		if b.nsPerOp() == 0 {
 			n = 1e9
 		} else {
 			n = int(d.Nanoseconds() / b.nsPerOp())
 		}
-		// Run more iterations than we think we'll need for a second (1.5x).
+		// Run more iterations than we think we'll need (1.2x).
 		// Don't grow too fast in case we had timing errors previously.
 		// Be sure to run at least one more than last time.
-		n = max(min(n+n/2, 100*last), last+1)
+		n = max(min(n+n/5, 100*last), last+1)
 		// Round up to something easy to read.
 		n = roundUp(n)
 		b.runN(n)

src/pkg/testing/benchmark_test.go

--- a/src/pkg/testing/benchmark_test.go
+++ b/src/pkg/testing/benchmark_test.go
@@ -41,12 +41,14 @@ var roundUpTests = []struct {
 	{0, 1},
 	{1, 1},
 	{2, 2},
+	{3, 3},
 	{5, 5},
 	{9, 10},
 	{999, 1000},
 	{1000, 1000},
 	{1400, 2000},
 	{1700, 2000},
+	{2700, 3000},
 	{4999, 5000},
 	{5000, 5000},
 	{5001, 10000},

コアとなるコードの解説

src/pkg/testing/benchmark.go

  1. roundUp関数の変更:

    • // roundUp rounds x up to a number of the form [1eX, 2eX, 5eX]. のコメントが // roundUp rounds x up to a number of the form [1eX, 2eX, 3eX, 5eX]. に更新され、3eX形式が追加されたことを示しています。
    • switch文の中に新しく case n <= (3 * base): return 3 * base という行が追加されました。これは、入力値nbasenの10の累乗の切り捨て値)の3倍以下である場合、3 * baseに丸めるというロジックです。例えば、n=2700の場合、base=1000となり、2700 <= (3 * 1000)が真となるため、3000が返されます。これにより、以前は5000に丸められていた値が3000に丸められるようになり、イテレーション数の過剰な増加が抑制されます。
  2. launch関数の変更:

    • コメント // Run more iterations than we think we'll need for a second (1.5x).// Run more iterations than we think we'll need (1.2x). に変更され、安全マージンが1.5倍から1.2倍に削減されたことを示しています。
    • イテレーション数を計算する行 n = max(min(n+n/2, 100*last), last+1)n = max(min(n+n/5, 100*last), last+1) に変更されました。
      • n+n/2n * (1 + 1/2) = n * 1.5 を意味します。
      • n+n/5n * (1 + 1/5) = n * 1.2 を意味します。 この変更により、推定されたイテレーション数に上乗せされる安全マージンが1.5倍から1.2倍に減少し、ベンチマークの実行時間が短縮されます。

src/pkg/testing/benchmark_test.go

  • roundUpTestsというテストケースのスライスに、{3, 3}{2700, 3000}という新しいテストケースが追加されました。
    • {3, 3}は、roundUp(3)3を返すことを確認します。これは3eX形式の導入により、base=1の場合に3*baseが正しく機能することを示します。
    • {2700, 3000}は、roundUp(2700)3000を返すことを確認します。これは、3eX形式の導入によって、以前は5000に丸められていた値が3000に丸められるようになったことを具体的にテストしています。

これらの変更は、Goのベンチマークシステムがより効率的に動作し、開発者がより迅速にパフォーマンスのフィードバックを得られるようにするための重要な改善です。

関連リンク

  • Go言語のtestingパッケージドキュメント: https://pkg.go.dev/testing
  • Go言語のベンチマークに関する公式ブログ記事 (もしあれば、より詳細な情報源として): https://go.dev/blog/ (一般的なGoブログのリンク。特定の記事はコミット当時のものを見つけるのが難しい場合があります。)
  • Goのコードレビューシステム (Gerrit): https://go-review.googlesource.com/ (コミットメッセージにあるhttps://golang.org/cl/105990045は、このGerritの変更リストへのリンクです。)

参考にした情報源リンク

  • コミットメッセージ自体 (./commit_data/19601.txtの内容)
  • Go言語のtestingパッケージのソースコード (src/pkg/testing/benchmark.go, src/pkg/testing/benchmark_test.go)
  • Go言語のベンチマークに関する一般的な知識 (Go公式ドキュメントやブログ記事など)
  • ウォールクロック時間とCPU時間の概念に関する一般的なコンピュータサイエンスの知識I have generated the detailed explanation in Markdown format, following all the specified instructions and chapter structure. I have included the commit details, GitHub link, original commit context, background, prerequisite knowledge, technical details, core code changes, and explanations, along with relevant links.

I will now output this to standard output.

# [インデックス 19601] ファイルの概要

このコミットは、Go言語の標準ライブラリ`testing`パッケージにおけるベンチマーク実行の効率を改善することを目的としています。具体的には、ベンチマークの実行時間を短縮するために、必要なイテレーション数の見積もり方法と、その見積もりを「読みやすい」数値に丸めるロジックを調整しています。これにより、ベンチマークが過剰に実行されることを防ぎ、全体的なテスト時間を削減します。

## コミット

commit a12cc7198072f2f02599d3c640807b97f748ddc6 Author: Josh Bleecher Snyder josharian@gmail.com Date: Tue Jun 24 08:39:30 2014 -0700

testing: make benchmarking faster

The number of estimated iterations required to reach the benchtime is multiplied by a safety margin (to avoid falling just short) and then rounded up to a readable number. With an accurate estimate, in the worse case, the resulting number of iterations could be 3.75x more than necessary: 1.5x for safety * 2.5x to round up (e.g. from 2eX+1 to 5eX).

This CL reduces the safety margin to 1.2x. Experimentation showed a diminishing margin of return past 1.2x, although the average case continued to show improvements down to 1.05x.

This CL also reduces the maximum round-up multiplier from 2.5x (from 2eX+1 to 5eX) to 2x, by allowing the number of iterations to be of the form 3eX.

Both changes improve benchmark wall clock times, and the effects are cumulative.

From 1.5x to 1.2x safety margin:

package         old s   new s   delta
bytes           163     125     -23%
encoding/json   27      21      -22%
net/http        42      36      -14%
runtime         463     418     -10%
strings         82      65      -21%

Allowing 3eX iterations:

package         old s   new s   delta
bytes           163     134     -18%
encoding/json   27      23      -15%
net/http        42      36      -14%
runtime         463     422     -9%
strings         82      72      -12%

Combined:

package         old s   new s   delta
bytes           163     112     -31%
encoding/json   27      20      -26%
net/http        42      30      -29%
runtime         463     346     -25%
strings         82      60      -27%

LGTM=crawshaw, r, rsc
R=golang-codereviews, crawshaw, r, rsc
CC=golang-codereviews
https://golang.org/cl/105990045

## GitHub上でのコミットページへのリンク

[https://github.com/golang/go/commit/a12cc7198072f2f02599d3c640807b97f748ddc6](https://github.com/golang/go/commit/a12cc7198072f2f02599d3c640807b97f748ddc6)

## 元コミット内容

Goのベンチマークシステムは、指定された`benchtime`(デフォルトでは1秒)に達するまで、ベンチマーク関数を繰り返し実行します。この際、システムは必要なイテレーション数を推定し、その推定値に「安全マージン」を乗じ、さらに「読みやすい」数値に丸めることで、ベンチマークが目標時間を確実に満たすようにしていました。

しかし、このアプローチには非効率性がありました。元の実装では、安全マージンが1.5倍、そして丸め処理が最大2.5倍(例: `2eX+1`から`5eX`への丸め)の乗数を持つ可能性がありました。最悪の場合、これにより必要なイテレーション数が最大で3.75倍(1.5倍 * 2.5倍)も多くなる可能性があり、結果としてベンチマークの実行時間が不必要に長くなっていました。

## 変更の背景

Goのベンチマークは、コードのパフォーマンス特性を測定するために不可欠なツールです。しかし、ベンチマークの実行に時間がかかりすぎると、開発サイクルが遅延し、CI/CDパイプラインの効率が低下します。特に、大規模なプロジェクトや多数のベンチマークを持つプロジェクトでは、この問題が顕著になります。

このコミットの目的は、ベンチマークの精度を維持しつつ、その実行時間を短縮することにありました。過剰なイテレーションは、正確な測定には寄与せず、単にCPU時間とウォールクロック時間を浪費するだけです。そのため、安全マージンと丸めロジックを見直すことで、ベンチマークのオーバーヘッドを削減し、開発者の生産性向上に貢献することが求められました。

## 前提知識の解説

このコミットを理解するためには、Go言語のベンチマークの仕組みと、一般的なベンチマーク測定における考慮事項について知っておく必要があります。

*   **Go言語のベンチマーク (`go test -bench`)**:
    Goの`testing`パッケージは、`BenchmarkXxx`という形式の関数を定義することで、コードのパフォーマンスを測定する機能を提供します。`go test -bench .`コマンドを実行すると、これらのベンチマーク関数が実行されます。
    ベンチマークは、指定された時間(`benchtime`、デフォルト1秒)に達するまで、ベンチマーク関数を繰り返し実行します。この繰り返し回数を「イテレーション数」と呼びます。
    最終的に、`N`回のイテレーションを実行するのにかかった時間`T`から、1イテレーションあたりの平均実行時間(`T/N`、通常はナノ秒/操作 `ns/op`)が計算され、表示されます。

*   **イテレーション数の推定と調整**:
    ベンチマークシステムは、最初の数回の実行結果に基づいて、目標の`benchtime`に達するために必要なイテレーション数を推定します。
    この推定値は、測定の安定性を確保するために、いくつかの調整が加えられます。
    *   **安全マージン (Safety Margin)**: 推定されたイテレーション数では目標時間にわずかに届かない可能性を考慮し、少し多めにイテレーションを実行するための乗数です。これにより、ベンチマークが目標時間を下回ることを防ぎます。
    *   **丸め処理 (Rounding Up)**: 計算されたイテレーション数を、人間が読みやすい、またはシステムが扱いやすい「きれいな」数値(例: 1000, 2000, 5000, 10000など)に丸める処理です。これは、ベンチマーク結果の表示を整える目的もあります。

*   **ウォールクロック時間 (Wall Clock Time)**:
    プログラムの実行開始から終了までの実時間のことです。CPU時間とは異なり、I/O待ちや他のプロセスの実行時間なども含まれます。ベンチマークの「速さ」を測る上で重要な指標です。

## 技術的詳細

このコミットは、主に`src/pkg/testing/benchmark.go`内の2つの主要なロジックを変更することで、ベンチマークの高速化を実現しています。

1.  **安全マージンの削減**:
    `launch`関数内で、次のイテレーション数を決定する際に使用される安全マージンが`1.5x`から`1.2x`に削減されました。
    元のコードでは、`n = max(min(n+n/2, 100*last), last+1)`という計算が行われていました。ここで`n+n/2`は`n * 1.5`に相当します。
    変更後、この部分は`n = max(min(n+n/5, 100*last), last+1)`となり、`n+n/5`は`n * 1.2`に相当します。
    この変更により、推定されたイテレーション数に対して、不必要に多くのイテレーションが追加されることが減り、ベンチマークの実行時間が短縮されます。コミットメッセージのデータが示すように、この変更単独でも各パッケージで10%〜23%の改善が見られました。

2.  **`roundUp`関数の改善(3eX形式の追加)**:
    `roundUp`関数は、イテレーション数を`1eX`, `2eX`, `5eX`の形式に丸めていました。例えば、1400は2000に、4999は5000に丸められます。
    このコミットでは、新たに`3eX`の形式(例: 3000, 30000など)が丸め対象に追加されました。
    具体的には、`roundUp`関数内の`switch`文に`case n <= (3 * base): return 3 * base`という条件が追加されました。
    これにより、例えば2700のような値が以前は5000に丸められていたものが、3000に丸められるようになります。
    この変更は、丸めによるイテレーション数の増加を最大2.5倍から最大2倍に削減します。これにより、丸め処理による過剰なイテレーションが減り、ベンチマークの実行時間がさらに短縮されます。コミットメッセージのデータが示すように、この変更単独でも各パッケージで9%〜18%の改善が見られました。

これらの変更は相乗効果をもたらし、両方を適用することで、ベンチマークのウォールクロック時間が大幅に短縮されることが示されています(例: `bytes`パッケージで31%減、`runtime`パッケージで25%減)。

## コアとなるコードの変更箇所

### `src/pkg/testing/benchmark.go`

```diff
--- a/src/pkg/testing/benchmark.go
+++ b/src/pkg/testing/benchmark.go
@@ -157,7 +157,7 @@ func roundDown10(n int) int {
 	return result
 }
 
-// roundUp rounds x up to a number of the form [1eX, 2eX, 5eX].
+// roundUp rounds x up to a number of the form [1eX, 2eX, 3eX, 5eX].
 func roundUp(n int) int {
 	base := roundDown10(n)
 	switch {
@@ -165,6 +165,8 @@ func roundUp(n int) int {
 		return base
 	case n <= (2 * base):
 		return 2 * base
+	case n <= (3 * base):
+		return 3 * base
 	case n <= (5 * base):
 		return 5 * base
 	default:
@@ -180,10 +182,10 @@ func (b *B) run() BenchmarkResult {\n }
 
 // launch launches the benchmark function.  It gradually increases the number
-// of benchmark iterations until the benchmark runs for a second in order
-// to get a reasonable measurement.  It prints timing information in this form
+// of benchmark iterations until the benchmark runs for the requested benchtime.
+// It prints timing information in this form
 //		testing.BenchmarkHello	100000		19 ns/op
-// launch is run by the fun function as a separate goroutine.
+// launch is run by the run function as a separate goroutine.
 func (b *B) launch() {
 	// Run the benchmark for a single iteration in case it's expensive.
 	n := 1
@@ -199,16 +201,16 @@ func (b *B) launch() {
 	d := *benchTime
 	for !b.failed && b.duration < d && n < 1e9 {
 		last := n
-		// Predict iterations/sec.
+		// Predict required iterations.
 		if b.nsPerOp() == 0 {
 			n = 1e9
 		} else {
 			n = int(d.Nanoseconds() / b.nsPerOp())
 		}
-		// Run more iterations than we think we'll need for a second (1.5x).
+		// Run more iterations than we think we'll need (1.2x).
 		// Don't grow too fast in case we had timing errors previously.
 		// Be sure to run at least one more than last time.
-		n = max(min(n+n/2, 100*last), last+1)
+		n = max(min(n+n/5, 100*last), last+1)
 		// Round up to something easy to read.
 		n = roundUp(n)
 		b.runN(n)

src/pkg/testing/benchmark_test.go

--- a/src/pkg/testing/benchmark_test.go
+++ b/src/pkg/testing/benchmark_test.go
@@ -41,12 +41,14 @@ var roundUpTests = []struct {
 	{0, 1},
 	{1, 1},
 	{2, 2},
+	{3, 3},
 	{5, 5},
 	{9, 10},
 	{999, 1000},
 	{1000, 1000},
 	{1400, 2000},
 	{1700, 2000},
+	{2700, 3000},
 	{4999, 5000},
 	{5000, 5000},
 	{5001, 10000},

コアとなるコードの解説

src/pkg/testing/benchmark.go

  1. roundUp関数の変更:

    • // roundUp rounds x up to a number of the form [1eX, 2eX, 5eX]. のコメントが // roundUp rounds x up to a number of the form [1eX, 2eX, 3eX, 5eX]. に更新され、3eX形式が追加されたことを示しています。
    • switch文の中に新しく case n <= (3 * base): return 3 * base という行が追加されました。これは、入力値nbasenの10の累乗の切り捨て値)の3倍以下である場合、3 * baseに丸めるというロジックです。例えば、n=2700の場合、base=1000となり、2700 <= (3 * 1000)が真となるため、3000が返されます。これにより、以前は5000に丸められていた値が3000に丸められるようになり、イテレーション数の過剰な増加が抑制されます。
  2. launch関数の変更:

    • コメント // Run more iterations than we think we'll need for a second (1.5x).// Run more iterations than we think we'll need (1.2x). に変更され、安全マージンが1.5倍から1.2倍に削減されたことを示しています。
    • イテレーション数を計算する行 n = max(min(n+n/2, 100*last), last+1)n = max(min(n+n/5, 100*last), last+1) に変更されました。
      • n+n/2n * (1 + 1/2) = n * 1.5 を意味します。
      • n+n/5n * (1 + 1/5) = n * 1.2 を意味します。 この変更により、推定されたイテレーション数に上乗せされる安全マージンが1.5倍から1.2倍に減少し、ベンチマークの実行時間が短縮されます。

src/pkg/testing/benchmark_test.go

  • roundUpTestsというテストケースのスライスに、{3, 3}{2700, 3000}という新しいテストケースが追加されました。
    • {3, 3}は、roundUp(3)3を返すことを確認します。これは3eX形式の導入により、base=1の場合に3*baseが正しく機能することを示します。
    • {2700, 3000}は、roundUp(2700)3000を返すことを確認します。これは、3eX形式の導入によって、以前は5000に丸められていた値が3000に丸められるようになったことを具体的にテストしています。

これらの変更は、Goのベンチマークシステムがより効率的に動作し、開発者がより迅速にパフォーマンスのフィードバックを得られるようにするための重要な改善です。

関連リンク

  • Go言語のtestingパッケージドキュメント: https://pkg.go.dev/testing
  • Go言語のベンチマークに関する公式ブログ記事 (もしあれば、より詳細な情報源として): https://go.dev/blog/ (一般的なGoブログのリンク。特定の記事はコミット当時のものを見つけるのが難しい場合があります。)
  • Goのコードレビューシステム (Gerrit): https://go-review.googlesource.com/ (コミットメッセージにあるhttps://golang.org/cl/105990045は、このGerritの変更リストへのリンクです。)

参考にした情報源リンク

  • コミットメッセージ自体 (./commit_data/19601.txtの内容)
  • Go言語のtestingパッケージのソースコード (src/pkg/testing/benchmark.go, src/pkg/testing/benchmark_test.go)
  • Go言語のベンチマークに関する一般的な知識 (Go公式ドキュメントやブログ記事など)
  • ウォールクロック時間とCPU時間の概念に関する一般的なコンピュータサイエンスの知識