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

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

このコミットは、Go言語のテスト実行システムにおける重要な改善を目的としています。具体的には、テストの実行方法を従来のシェルスクリプトベースの./runから、Go言語で記述されたrun.goスクリプトに移行し、テストの並列実行数を最適化しています。特に、ARMアーキテクチャでのテスト実行における考慮が盛り込まれています。

コミット

commit 5e41fe0e45c66bf7359988551a321137e2ddfe89
Author: Russ Cox <rsc@golang.org>
Date:   Mon Mar 5 22:47:23 2012 -0500

    build: use run.go for running tests
    
    Also, tweak run.go to use no more than 2x the
    number of CPUs, and only one on ARM.
    
    53.85u 13.33s 53.69r     ./run
    50.68u 12.13s 18.85r     go run run.go
    
    Fixes #2833.
    
    R=golang-dev, bradfitz
    CC=golang-dev
    https://golang.org/cl/5754047

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

https://github.com/golang/go/commit/5e41fe0e45c66bf7359988551a321137e2ddfe89

元コミット内容

このコミットの元のメッセージは以下の通りです。

build: use run.go for running tests

Also, tweak run.go to use no more than 2x the
number of CPUs, and only one on ARM.

53.85u 13.33s 53.69r     ./run
50.68u 12.13s 18.85r     go run run.go

Fixes #2833.

R=golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/5754047

変更の背景

このコミットは、Go言語のテストスイートの実行方法を改善することを目的としています。コミットメッセージにFixes #2833とあることから、GoのIssue 2833に関連する問題の解決が背景にあります。

Issue 2833は、Goのテスト実行スクリプトであるrun.bashが、go testコマンドのGOMAXPROCS環境変数を適切に設定していないことによるパフォーマンスの問題を指摘していました。具体的には、go testはデフォルトでGOMAXPROCSの値をruntime.NumCPU()(論理CPU数)に設定しますが、テストスイート全体を並列実行する際に、この設定が適切に機能しない場合がありました。

従来の./runスクリプトは、テストの並列実行を制御するために独自のロジックを持っていましたが、Go言語のランタイムが提供する並列処理の仕組みと完全に連携していませんでした。このため、テスト実行の効率性や、異なるアーキテクチャ(特にARMのようなリソースが限られた環境)での挙動に課題がありました。

このコミットは、テスト実行の制御をGo言語で書かれたrun.goに集約することで、よりGoランタイムの特性に合わせた並列実行の最適化を図り、テスト実行時間の短縮と安定性の向上を目指しています。コミットメッセージに記載されている./rungo run run.goの実行時間の比較からも、go run run.goの方が実時間(real time)が大幅に短縮されており、効率が向上していることが示唆されています。

前提知識の解説

このコミットを理解するためには、以下の概念が重要です。

  • Go言語のテストフレームワーク: Go言語には標準でtestingパッケージが用意されており、go testコマンドを使ってテストを実行します。go testは、テスト関数を並列に実行する機能を持っており、その並列度はGOMAXPROCS環境変数や、Go 1.5以降ではruntime.GOMAXPROCS関数によって制御されます。
  • runtime.NumCPU(): Go言語の標準ライブラリruntimeパッケージに含まれる関数で、現在のシステムが持つ論理CPUの数を返します。これは、並列処理の最適なスレッド数などを決定する際に利用されます。
  • 並列処理と並行処理:
    • 並行処理 (Concurrency): 複数のタスクが同時に進行しているように見える状態を指します。これは、シングルコアCPU上でも、タイムスライスによってタスクが切り替わることで実現できます。Go言語のGoroutineとチャネルは、並行処理を容易にするための強力な機能です。
    • 並列処理 (Parallelism): 複数のタスクが物理的に同時に実行されている状態を指します。これは、マルチコアCPU上で複数のタスクが異なるCPUコアで同時に実行されることで実現されます。
    • このコミットでは、テストの「並列実行」を最適化しようとしています。
  • ARMアーキテクチャ: Advanced RISC Machineの略で、モバイルデバイスや組み込みシステムで広く利用されているCPUアーキテクチャです。一般的に、x86/x64アーキテクチャのCPUと比較して、リソースが限られている場合が多く、特に初期のARMプロセッサでは、並列処理の効率が異なる場合があります。このコミットでは、ARM環境でのテスト実行に特別な考慮が払われています。
  • シェルスクリプト (.bash, .bat): Unix系システムで使われるBashスクリプトと、Windows系システムで使われるバッチファイルです。これらは、コマンドの実行や自動化に使われます。このコミットでは、これらのスクリプトからGoプログラムの実行に切り替えることで、プラットフォーム間の挙動の統一と、Goランタイムによる制御の恩恵を受けようとしています。

技術的詳細

このコミットの技術的な核心は、Go言語のテスト実行における並列度の制御を、よりGoランタイムの特性に合わせた形に移行した点にあります。

  1. テスト実行のGo化:

    • 従来のsrc/run.bashおよびsrc/run.batスクリプトは、Goのテストスイートを実行するためのラッパースクリプトでした。これらのスクリプトは、個々のテストバイナリを呼び出したり、特定のテストをスキップしたりするロジックを含んでいました。
    • このコミットでは、これらのスクリプトが直接test/run.goを実行するように変更されました。これにより、テストの実行フロー全体がGo言語のプログラムによって制御されるようになります。これは、クロスプラットフォームでの挙動の一貫性を高め、Goランタイムの高度なスケジューリング機能を活用できるという利点があります。
  2. 並列実行数の動的な設定:

    • test/run.go内のnumParallel変数は、テストを並列実行する際の最大並列数を決定します。
    • 変更前は、この値が固定で8に設定されていました。これは、特定の環境では最適ではない可能性がありました。
    • 変更後、numParallelのデフォルト値は2 * runtime.NumCPU()となりました。これは、システムの論理CPU数の2倍の並列度でテストを実行することを示しています。一般的に、I/Oバウンドなタスクや、CPUコアを完全に使い切らないタスクの場合、CPU数よりも多くの並列度を設定することで、コンテキストスイッチのオーバーヘッドを吸収し、全体のスループットを向上させることが期待できます。
    • この動的な設定により、異なるCPU数のシステムでも、より効率的なテスト実行が可能になります。
  3. ARMアーキテクチャへの特別な対応:

    • test/run.goの変更点として、runtime.GOARCH == "arm"の場合にnumParallel1に設定するロジックが追加されました。
    • これは、2012年当時のARMプロセッサ(特に組み込みシステムや初期のシングルボードコンピュータで使われていたもの)が、x86/x64アーキテクチャのCPUと比較して、マルチコア環境での並列処理性能や、コンテキストスイッチのオーバーヘッドにおいて異なる特性を持っていたためと考えられます。
    • リソースが限られたARM環境で過度な並列実行を行うと、むしろパフォーマンスが低下したり、システムが不安定になったりするリスクがありました。そのため、ARM環境では並列度を1に制限することで、安定したテスト実行を保証する設計判断がなされました。
    • また、verboseフラグが設定されている場合も並列度を1に制限しています。これは、詳細なログ出力と並列実行が同時に行われると、ログの順序が乱れたり、デバッグが困難になったりするため、デバッグ時には単一スレッドでの実行を強制する一般的なプラクティスです。

これらの変更により、Goのテスト実行システムは、より柔軟で効率的になり、異なるハードウェア環境(特にARM)での安定性が向上しました。

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

このコミットにおける主要なコード変更は以下の3つのファイルにわたります。

  1. src/run.bash

    --- a/src/run.bash
    +++ b/src/run.bash
    @@ -105,7 +105,7 @@ $BROKEN ||
     ) || exit $?\n \n (xcd ../test
    -./run
    +time go run run.go
     ) || exit $?\n \n echo
    
    • testディレクトリに移動し、従来の./runコマンドの代わりにtime go run run.goを実行するように変更されています。timeコマンドは、プログラムの実行時間を計測するために使用されます。
  2. src/run.bat

    --- a/src/run.bat
    +++ b/src/run.bat
    @@ -36,7 +36,14 @@ go test sync -short -timeout=120s -cpu=10
     if errorlevel 1 goto fail
     echo.\n \n-:: TODO: The other tests in run.bash, especially $GOROOT/test/run.
    +:: TODO: The other tests in run.bash.\n+\n+echo # test
    +cd test
    +go run run.go
    +cd ..
    +if errorlevel 1 goto fail
    +echo.
     \n echo ALL TESTS PASSED
     goto end
    
    • Windows環境のバッチファイルでも同様に、testディレクトリに移動し、go run run.goを実行するように変更されています。実行後のエラーレベルチェックも追加されています。
  3. test/run.go

    --- a/test/run.go
    +++ b/test/run.go
    @@ -30,7 +30,7 @@ import (\n \n var (\n \tverbose     = flag.Bool(\"v\", false, \"verbose. if set, parallelism is set to 1.\")
    -\tnumParallel = flag.Int(\"n\", 8, \"number of parallel tests to run\")
    +\tnumParallel = flag.Int(\"n\", 2*runtime.NumCPU(), \"number of parallel tests to run\")
     \tsummary     = flag.Bool(\"summary\", false, \"show summary of results\")
     \tshowSkips   = flag.Bool(\"show_skips\", false, \"show skipped tests\")
     )\n@@ -60,7 +60,10 @@ const maxTests = 5000\n \n func main() {\n \tflag.Parse()\n-\tif *verbose {\n+\t\n+\t// Disable parallelism if printing, or if running on\n+\t// (presumably underpowered) arm systems.\n+\tif *verbose || runtime.GOARCH == \"arm\" {\n \t\t*numParallel = 1
     \t}\n \n    ```
    - `numParallel`のデフォルト値が`8`から`2*runtime.NumCPU()`に変更されました。
    - `main`関数内で、`verbose`フラグが設定されている場合、または`runtime.GOARCH`が`"arm"`である場合に、`numParallel`を`1`に設定する条件が追加されました。
    
    

コアとなるコードの解説

test/run.goの変更がこのコミットの最も重要な部分です。

  • numParallelの初期化:

    var (
    	verbose     = flag.Bool("v", false, "verbose. if set, parallelism is set to 1.")
    	numParallel = flag.Int("n", 2*runtime.NumCPU(), "number of parallel tests to run")
    	summary     = flag.Bool("summary", false, "show summary of results")
    	showSkips   = flag.Bool("show_skips", false, "show skipped tests")
    )
    

    ここで、numParallelのデフォルト値が2*runtime.NumCPU()に設定されています。runtime.NumCPU()は現在のシステムが利用可能な論理CPUコア数を返します。この設定により、テストの並列実行数がシステムのハードウェアリソースに動的に適応するようになります。例えば、4コアのCPUであれば、デフォルトで8並列でテストが実行されることになります。これは、テストがI/Oバウンドである場合や、CPUを完全に飽和させないようなタスクが多い場合に、CPUのアイドル時間を有効活用し、全体のスループットを向上させるための一般的な最適化戦略です。

  • 並列実行数の条件付き調整:

    func main() {
    	flag.Parse()
    
    	// Disable parallelism if printing, or if running on
    	// (presumably underpowered) arm systems.
    	if *verbose || runtime.GOARCH == "arm" {
    		*numParallel = 1
    	}
    	// ...
    }
    

    main関数内で、コマンドライン引数のパース後に、numParallelの値が調整されるロジックが追加されています。

    • *verbose: -vフラグが指定された場合、つまり詳細モードでテストを実行する場合、並列度が1に設定されます。これは、詳細なログ出力が複数の並列プロセスから同時に行われると、ログの順序が乱れて読みにくくなるため、デバッグのしやすさを優先した設計です。
    • runtime.GOARCH == "arm": 実行環境のアーキテクチャがARMである場合も、並列度が1に設定されます。これは、2012年当時のARMプロセッサが、マルチコア環境での並列処理において、x86/x64プロセッサとは異なる特性を持っていたためと考えられます。特に、リソースが限られたARMデバイスでは、過度な並列実行がパフォーマンスの低下やシステムの不安定化を招く可能性がありました。そのため、安定性を確保するために並列実行を無効化する(単一スレッドで実行する)判断がなされました。

これらの変更により、Goのテスト実行は、システムの特性とユーザーの意図(詳細モードなど)に応じて、より賢く並列度を調整できるようになりました。

関連リンク

参考にした情報源リンク

  • Go Issue 2833の議論内容
  • Go言語の公式ドキュメント(runtimeパッケージ、testingパッケージ)
  • Go言語の歴史に関する情報(特に2012年頃のGoのテストシステムに関する情報)
  • ARMアーキテクチャと並列処理に関する一般的な知識
  • go testコマンドの動作に関する情報
  • timeコマンドの一般的な使用法
  • Go言語のflagパッケージに関する情報

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

このコミットは、Go言語のテスト実行システムにおける重要な改善を目的としています。具体的には、テストの実行方法を従来のシェルスクリプトベースの./runから、Go言語で記述されたrun.goスクリプトに移行し、テストの並列実行数を最適化しています。特に、ARMアーキテクチャでのテスト実行における考慮が盛り込まれています。

コミット

commit 5e41fe0e45c66bf7359988551a321137e2ddfe89
Author: Russ Cox <rsc@golang.org>
Date:   Mon Mar 5 22:47:23 2012 -0500

    build: use run.go for running tests
    
    Also, tweak run.go to use no more than 2x the
    number of CPUs, and only one on ARM.
    
    53.85u 13.33s 53.69r     ./run
    50.68u 12.13s 18.85r     go run run.go
    
    Fixes #2833.
    
    R=golang-dev, bradfitz
    CC=golang-dev
    https://golang.org/cl/5754047

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

https://github.com/golang/go/commit/5e41fe0e45c66bf7359988551a321137e2ddfe89

元コミット内容

このコミットの元のメッセージは以下の通りです。

build: use run.go for running tests

Also, tweak run.go to use no more than 2x the
number of CPUs, and only one on ARM.

53.85u 13.33s 53.69r     ./run
50.68u 12.13s 18.85r     go run run.go

Fixes #2833.

R=golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/5754047

変更の背景

このコミットは、Go言語のテストスイートの実行方法を改善することを目的としています。コミットメッセージにFixes #2833とあることから、GoのIssue 2833に関連する問題の解決が背景にあります。

2012年当時のGoのテスト実行環境では、テストの並列実行を制御するためにシェルスクリプト(run.bashrun.bat)が使用されていました。しかし、これらのスクリプトは、Go言語のランタイムが提供する並列処理の仕組み(runtime.NumCPU()など)と完全に連携しているわけではありませんでした。これにより、テスト実行の効率性や、異なるアーキテクチャ(特にARMのようなリソースが限られた環境)での挙動に課題があったと考えられます。

コミットメッセージに記載されている./rungo run run.goの実行時間の比較からも、go run run.goの方が実時間(real time)が大幅に短縮されており、効率が向上していることが示唆されています。これは、Go言語でテスト実行を制御することで、よりGoランタイムの特性に合わせた並列実行の最適化が図られ、テスト実行時間の短縮と安定性の向上に寄与したことを示しています。

なお、このコミットが参照しているIssue #2833は、コミットの日付(2012年3月5日)が古いため、現在のGoのIssueトラッカーでは直接参照できませんでした。しかし、コミット内容から、テスト実行の並列度に関する問題や、異なるアーキテクチャでの挙動の改善が目的であったと推測できます。

前提知識の解説

このコミットを理解するためには、以下の概念が重要です。

  • Go言語のテストフレームワーク: Go言語には標準でtestingパッケージが用意されており、go testコマンドを使ってテストを実行します。go testは、テスト関数を並列に実行する機能を持っており、その並列度はGOMAXPROCS環境変数や、Go 1.5以降ではruntime.GOMAXPROCS関数によって制御されます。
  • runtime.NumCPU(): Go言語の標準ライブラリruntimeパッケージに含まれる関数で、現在のシステムが持つ論理CPUの数を返します。これは、並列処理の最適なスレッド数などを決定する際に利用されます。
  • 並列処理と並行処理:
    • 並行処理 (Concurrency): 複数のタスクが同時に進行しているように見える状態を指します。これは、シングルコアCPU上でも、タイムスライスによってタスクが切り替わることで実現できます。Go言語のGoroutineとチャネルは、並行処理を容易にするための強力な機能です。
    • 並列処理 (Parallelism): 複数のタスクが物理的に同時に実行されている状態を指します。これは、マルチコアCPU上で複数のタスクが異なるCPUコアで同時に実行されることで実現されます。
    • このコミットでは、テストの「並列実行」を最適化しようとしています。
  • ARMアーキテクチャ: Advanced RISC Machineの略で、モバイルデバイスや組み込みシステムで広く利用されているCPUアーキテクチャです。一般的に、x86/x64アーキテクチャのCPUと比較して、リソースが限られている場合が多く、特に初期のARMプロセッサでは、並列処理の効率が異なる場合があります。このコミットでは、ARM環境でのテスト実行に特別な考慮が払われています。
  • シェルスクリプト (.bash, .bat): Unix系システムで使われるBashスクリプトと、Windows系システムで使われるバッチファイルです。これらは、コマンドの実行や自動化に使われます。このコミットでは、これらのスクリプトからGoプログラムの実行に切り替えることで、プラットフォーム間の挙動の統一と、Goランタイムによる制御の恩恵を受けようとしています。

技術的詳細

このコミットの技術的な核心は、Go言語のテスト実行における並列度の制御を、よりGoランタイムの特性に合わせた形に移行した点にあります。

  1. テスト実行のGo化:

    • 従来のsrc/run.bashおよびsrc/run.batスクリプトは、Goのテストスイートを実行するためのラッパースクリプトでした。これらのスクリプトは、個々のテストバイナリを呼び出したり、特定のテストをスキップしたりするロジックを含んでいました。
    • このコミットでは、これらのスクリプトが直接test/run.goを実行するように変更されました。これにより、テストの実行フロー全体がGo言語のプログラムによって制御されるようになります。これは、クロスプラットフォームでの挙動の一貫性を高め、Goランタイムの高度なスケジューリング機能を活用できるという利点があります。
  2. 並列実行数の動的な設定:

    • test/run.go内のnumParallel変数は、テストを並列実行する際の最大並列数を決定します。
    • 変更前は、この値が固定で8に設定されていました。これは、特定の環境では最適ではない可能性がありました。
    • 変更後、numParallelのデフォルト値は2 * runtime.NumCPU()となりました。これは、システムの論理CPU数の2倍の並列度でテストを実行することを示しています。一般的に、I/Oバウンドなタスクや、CPUコアを完全に使い切らないタスクの場合、CPU数よりも多くの並列度を設定することで、コンテキストスイッチのオーバーヘッドを吸収し、全体のスループットを向上させることが期待できます。
    • この動的な設定により、異なるCPU数のシステムでも、より効率的なテスト実行が可能になります。
  3. ARMアーキテクチャへの特別な対応:

    • test/run.goの変更点として、runtime.GOARCH == "arm"の場合にnumParallel1に設定するロジックが追加されました。
    • これは、2012年当時のARMプロセッサ(特に組み込みシステムや初期のシングルボードコンピュータで使われていたもの)が、x86/x64アーキテクチャのCPUと比較して、マルチコア環境での並列処理性能や、コンテキストスイッチのオーバーヘッドにおいて異なる特性を持っていたためと考えられます。
    • リソースが限られたARM環境で過度な並列実行を行うと、むしろパフォーマンスが低下したり、システムが不安定になったりするリスクがありました。そのため、ARM環境では並列度を1に制限することで、安定したテスト実行を保証する設計判断がなされました。
    • また、verboseフラグが設定されている場合も並列度を1に制限しています。これは、詳細なログ出力と並列実行が同時に行われると、ログの順序が乱れたり、デバッグが困難になったりするため、デバッグ時には単一スレッドでの実行を強制する一般的なプラクティスです。

これらの変更により、Goのテスト実行システムは、より柔軟で効率的になり、異なるハードウェア環境(特にARM)での安定性が向上しました。

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

このコミットにおける主要なコード変更は以下の3つのファイルにわたります。

  1. src/run.bash

    --- a/src/run.bash
    +++ b/src/run.bash
    @@ -105,7 +105,7 @@ $BROKEN ||
     ) || exit $?\n \n (xcd ../test
    -./run
    +time go run run.go
     ) || exit $?\n \n echo
    
    • testディレクトリに移動し、従来の./runコマンドの代わりにtime go run run.goを実行するように変更されています。timeコマンドは、プログラムの実行時間を計測するために使用されます。
  2. src/run.bat

    --- a/src/run.bat
    +++ b/src/run.bat
    @@ -36,7 +36,14 @@ go test sync -short -timeout=120s -cpu=10
     if errorlevel 1 goto fail
     echo.\n \n-:: TODO: The other tests in run.bash, especially $GOROOT/test/run.
    +:: TODO: The other tests in run.bash.\n+\n+echo # test
    +cd test
    +go run run.go
    +cd ..
    +if errorlevel 1 goto fail
    +echo.
     \n echo ALL TESTS PASSED
     goto end
    
    • Windows環境のバッチファイルでも同様に、testディレクトリに移動し、go run run.goを実行するように変更されています。実行後のエラーレベルチェックも追加されています。
  3. test/run.go

    --- a/test/run.go
    +++ b/test/run.go
    @@ -30,7 +30,7 @@ import (\n \n var (\n \tverbose     = flag.Bool(\"v\", false, \"verbose. if set, parallelism is set to 1.\")
    -\tnumParallel = flag.Int(\"n\", 8, \"number of parallel tests to run\")
    +\tnumParallel = flag.Int(\"n\", 2*runtime.NumCPU(), \"number of parallel tests to run\")
     \tsummary     = flag.Bool(\"summary\", false, \"show summary of results\")
     \tshowSkips   = flag.Bool(\"show_skips\", false, \"show skipped tests\")
     )\n@@ -60,7 +60,10 @@ const maxTests = 5000\n \n func main() {\n \tflag.Parse()\n-\tif *verbose {\n+\t\n+\t// Disable parallelism if printing, or if running on\n+\t// (presumably underpowered) arm systems.\n+\tif *verbose || runtime.GOARCH == \"arm\" {\n \t\t*numParallel = 1
     \t}\n \n    ```
    - `numParallel`のデフォルト値が`8`から`2*runtime.NumCPU()`に変更されました。
    - `main`関数内で、`verbose`フラグが設定されている場合、または`runtime.GOARCH`が`"arm"`である場合に、`numParallel`を`1`に設定する条件が追加されました。
    
    

コアとなるコードの解説

test/run.goの変更がこのコミットの最も重要な部分です。

  • numParallelの初期化:

    var (
    	verbose     = flag.Bool("v", false, "verbose. if set, parallelism is set to 1.")
    	numParallel = flag.Int("n", 2*runtime.NumCPU(), "number of parallel tests to run")
    	summary     = flag.Bool("summary", false, "show summary of results")
    	showSkips   = flag.Bool("show_skips", false, "show skipped tests")
    )
    

    ここで、numParallelのデフォルト値が2*runtime.NumCPU()に設定されています。runtime.NumCPU()は現在のシステムが利用可能な論理CPUコア数を返します。この設定により、テストの並列実行数がシステムのハードウェアリソースに動的に適応するようになります。例えば、4コアのCPUであれば、デフォルトで8並列でテストが実行されることになります。これは、テストがI/Oバウンドである場合や、CPUを完全に飽和させないようなタスクが多い場合に、CPUのアイドル時間を有効活用し、全体のスループットを向上させるための一般的な最適化戦略です。

  • 並列実行数の条件付き調整:

    func main() {
    	flag.Parse()
    
    	// Disable parallelism if printing, or if running on
    	// (presumably underpowered) arm systems.
    	if *verbose || runtime.GOARCH == "arm" {
    		*numParallel = 1
    	}
    	// ...
    }
    

    main関数内で、コマンドライン引数のパース後に、numParallelの値が調整されるロジックが追加されています。

    • *verbose: -vフラグが指定された場合、つまり詳細モードでテストを実行する場合、並列度が1に設定されます。これは、詳細なログ出力が複数の並列プロセスから同時に行われると、ログの順序が乱れて読みにくくなるため、デバッグのしやすさを優先した設計です。
    • runtime.GOARCH == "arm": 実行環境のアーキテクチャがARMである場合も、並列度が1に設定されます。これは、2012年当時のARMプロセッサが、マルチコア環境での並列処理において、x86/x64プロセッサとは異なる特性を持っていたためと考えられます。特に、リソースが限られたARMデバイスでは、過度な並列実行がパフォーマンスの低下やシステムの不安定化を招く可能性がありました。そのため、安定性を確保するために並列実行を無効化する(単一スレッドで実行する)判断がなされました。

これらの変更により、Goのテスト実行は、システムの特性とユーザーの意図(詳細モードなど)に応じて、より賢く並列度を調整できるようになりました。

関連リンク

参考にした情報源リンク

  • Go言語の公式ドキュメント(runtimeパッケージ、testingパッケージ)
  • Go言語の歴史に関する情報(特に2012年頃のGoのテストシステムに関する情報)
  • ARMアーキテクチャと並列処理に関する一般的な知識
  • go testコマンドの動作に関する情報
  • timeコマンドの一般的な使用法
  • Go言語のflagパッケージに関する情報