ゴーは2019年にリリースゴー1.12とゴー1.13。変更のほとんどは、ツールチェーンゴー1.13、実装、およびランタイムライブラリのことです。わずか6ヶ月後、ゴー1.14が正式にリリース。
そして、以前のバージョンでは、このバージョンには、互換性のコミットメント、ランタイムライブラリのツールチェーンのパフォーマンスの側面の最新バージョン場合ゴー1を保持します。一般的な、または連続的な最適化に基づいて、既存の委員会では、我々は、ジェネリック医薬品はまだ来ています、その下に新しい変化を見て期待しています。次のようにメジャーアップデートは以下のとおりです。
- ゴーコマンドモジュールのサポートは現在、生産に入れることができます
- インタフェースの重複セットを埋め込む方法
- 延期パフォーマンスの向上
- ゴルーチンサポートは、非同期つかみます
- 工具交換
- time.Timerタイマーパフォーマンス向上
ゴーコマンドモジュールのサポートは現在、生産に入れることができます
さて、あなたは本番用の移動コマンドモジュールのサポートを使用し、依存関係の管理のために行くのモジュールに移行するすべてのユーザーを促すことができます。
インタフェースの重複セットを埋め込む方法
方法および組み込みインターフェイスから既存のインターフェイスメソッドが同じ名前とシグネチャを持つ(埋め込む)ことができます:GO 1.14は、現在のメソッドのセットと重複インタフェースを埋め込むことができます。
ゴー1.14前に、以下の定義がエラーをコンパイルします。
type ReadWriteCloser interface {
io.ReadCloser
io.WriteCloser
}
复制代码
Closeメソッドのでio.ReadCloserとio.WriteCloserを繰り返しました。同じシグネチャを可能外出1.14 Startメソッドは、コネクタ内に埋め込むことができます。前述のように、明示的に宣言インターフェイスメソッドは、ユニークでなければなりません。
延期パフォーマンスの向上
ほとんど0コストの使用の最も延期パフォーマンスを向上させるGo1.14!延期すでに高いパフォーマンス要件のシーンのために使用。
延期について、移動中に1.13バージョンがゴー1.12に比べて、いくつかの最適化を行っている、延期ほとんど30%のパフォーマンスを使用しています。そして、より効率的なの改善後に1.14を行きます!
ゴルーチンサポートは、非同期つかみます
GMPスケジューラモデルが使用されています。以下は、関連する概念です。
- G(ゴルーチン):ゴルーチン、キーワードによって作成されたが行きます
- M(マシン):移動中にマシンと呼ばれるが、ワーカースレッドとして理解することができます
- P(プロセッサ)プロセッサP Mとゴルーチンスレッド(ないCPU)との間の中間層であります
M PがG内のコードを実行するために保持する必要があり、Pは、Gコンポーネントによって実行自身のローカル実行キューを有し、キューゴルーチンの頭部に入るスケジューラキュープロセッサPが選択されたスレッドで動作しますMに対して行わ、図に示すスレッドM、プロセッサPとゴルーチンの関係。
Gは、各P維持することができるバランスされていない、スケジューラはまた、グローバルキューGを維持G Pは、ローカルタスクの実行終了時ときP、タスクの実行は、グローバルキューから(ロックが必要)Gを取得しようとしローカル・キューと全く実行可能なタスクが他のP Gのローカル実行キュー(タスクスチールを)盗むしようとしませんグローバルキュー。
ゴー1.1バージョンでは、スケジューラはプリエンプティブスケジューリングをサポートしていない、唯一のCPUリソースへのゴルーチンイニシアチブに頼ることができ、非常に深刻なスケジューリングの問題があります:
- ゴルーチンが常に実行するために別のスレッドを占有することができ、それは飢餓を引き起こし、他のゴルーチンに切り替わりません。
- ガベージコレクションプログラム全体を引き起こし、数分かかることがあり、時間をつかむしない場合は、プログラム全体(ストップ世界、STW)を一時停止する必要は仕事をしません
コラボレーティブプリエンプティブスケジューリングを達成するためのエントリとしてつかむために、関数呼び出しによってトリガ特定のタイミングで1.12コンパイラの挿入機能を移動します。ただし、この機能は、例えば、次の例をスケジューリング方式で、いくつかのエッジケースを呼び出すためのイニシアチブを取る必要があります。
import (
"runtime"
"time"
)
func main() {
runtime.GOMAXPROCS(1)
go func() { //创建一个goroutine并挂起
for {
}
}()
time.Sleep(time.Millisecond) //main goroutine 优先调用了 休眠
println("OK")
}
复制代码
この時点では、唯一のPが作成されたループの実装ゴルーチンに変わります、その後、メインゴルーチンが再び予定されることはありません。Go1.14前言い換えれば、出力コードの上にOKになることはありません。コラボレーティブプリエンプティブスケジューリングゴー1.12を放棄する権利を実装することなく達成されず、任意のゴルーチン関数呼び出しに参加していないので、これはプリエンプトされています。
Go1.14は、上記の問題の本当の信号に基づいてプリエンプティブスケジューリングを実装することで解決し、これは非常に大きな変化である、ゴーチームが再構築されており、論理ゴルーチンが支持状態に新しいフィールドを追加し、つかむです。いいえ関数呼び出しサイクルはもはやスケジューラデッドロックや影響のGCが発生することはできません。Windowsの/アーム、ダーウィン/アーム、JS / wasmとサポートこの機能以外のPlan9の/ *を除くすべてのプラットフォーム。
プリエンプションの結果は、移動1.14手順を使用してのMacOSなど、LinuxおよびUNIXシステム、を含むシステムでは、以前のバージョン上に構築されたプログラムを使用して複数の受信信号よりも構築されています。これは、複数のプログラムが、システムコール、およびEINTRエラーが遅くなります見てのように、このようなシステムコールやgolang.org/x/sys/unixなどのソフトウェアパッケージを使用して。これらのプログラムは、何らかの方法でそれらのミスに対処する必要がありますが、最も可能性の高い循環システムが再び呼び出そうとすることです。これに関する詳細については、Linuxシステムまたは他のシステムのための類似した文書のman 7信号を参照してください。
工具交換
Go1.14について完璧なツールは、主に、外出先MODについて話してテストを行って、移動の公式は確かGo1.14は、多くの機能を改善し、開発者が公式のパッケージ管理ツールを使用します。以下の改善を行ってMOD行きます:
- incompatiableバージョン:明示的に要求またはバージョン、それ以外の場合は、もはやメインモジュール互換性のないバージョンにアップグレード取りに行くだろうという要請している場合を除き、モジュールは、ファイルのgo.mod最新バージョンが含まれている場合。バージョン管理から直接ご利用の際は、外出先のリストは、このモジュールの互換性のないバージョンでは無視されますが、エージェントによって報告された場合、それはそれらのバージョンを含むことができます。
- go.modファイル保守:他にすること
go mod tidy
なくなった削除が間接的に暗黙の他の依存関係のメインモジュールとなっている依存のバージョンを、指定した命令を、必要とコマンドを越えて行きます。加えてgo mod tidy
、あなただけの変更な性質を変更する場合は、コマンドを越え、もはや編集したファイルをgo.modません。 - モジュールのダウンロード:モジュールモードでは、コマンドは現在のモジュールのエージェントや他のHTTPサーバからのエラーメッセージのプレーンテキストの要約が含まれて行く、コマンドがサポートSVNリポジトリを行きます。エラーメッセージが有効なUTF-8で、グラフィック文字とスペースが含まれている場合は、エラーメッセージが表示されます。
t.Logは現在テスト-v出力ストリームを行くのではなく、出力試験データの最後に全てます。
time.Timerタイマーパフォーマンス向上
グローバルトップを使用して行くの言語、でゴー1.10以前のバージョンでは、小さなヒープは、すべてのタイマーを維持するクワッド。内部タイマーtime.after、time.Tick、net.Conn.SetDeadline友人や使用、少数のロック競合のより大きな効率は、少数のコンテキストが切り替わります。これは、任意のユーザに見える変化を引き起こすことなく、性能向上です。
ここでは具体的な改善は、私たちが自分自身を下げることができ、比較的複雑であり、私は新しい実装、フォローアップこの部分に専念を学んでいます。
概要
ゴー1.14他の多くの変更があります。
- 変更WebAssembly
- 変更は、パッケージを反映します
- 他の多くの重要なパッケージ(数学、HTTPなど)の変更
ゴー言語の提案をエラー処理がコミュニティ多くの人々の支持を得たが、反対に多くの人々があり、結論は次のとおりです。Goはこの提案をあきらめました!関連する列挙し、不変は、囲碁言語は最近達成アカウントチームに入れないように、これらのアイデアは完全に、特に考慮に言語の実装への変更のコストを取ったときに、開発されていません。
Go1.14は、Go1.14がGOMAXPROCS値は、ロック競合の大幅な削減が比較的大きいときに達成することができ、ページアロケータ(ページアロケータ)を最適化しようとするいくつかの計画が、未完の作品があります。大きく影響この変更は、大幅に並列処理ゴーを向上させることができ、さらにタイマーのパフォーマンスを向上させます。しかし、実装がより複雑に起因する、Go1.15が完了遅らせるために遅すぎる解決するためにいくつかの問題があります。
ゴー1.14の詳細なログを公開し、あなたが見ることができますgolang.org/doc/go1.14。