目次
質問の内容
解決策
ホームページ バックエンド開発 Golang この配列アクセス マイクロベンチマークで (GCC と比較して) Go の 4 倍のパフォーマンス低下の原因は何ですか?

この配列アクセス マイクロベンチマークで (GCC と比較して) Go の 4 倍のパフォーマンス低下の原因は何ですか?

Feb 10, 2024 am 08:51 AM
言語を移動 コンパイルエラー

在这个数组访问微基准测试中(相对于 GCC),Go 的性能损失了 4 倍,是什么原因造成的?

この配列アクセス マイクロベンチマーク (GCC と比較) では、Go は 4 倍のパフォーマンス低下を被っています。これは何が原因でしょうか?この問題には、Go 言語のランタイム メカニズムやコンパイラの最適化など、多くの側面が関係します。まず、Go 言語は配列にアクセスするときに境界チェック メカニズムを使用します。つまり、配列要素にアクセスするたびに境界チェックが実行されるため、パフォーマンスがある程度低下します。次に、Go 言語コンパイラは最適化が比較的弱く、配列アクセスをうまく最適化できません。さらに、Go 言語のガベージ コレクション メカニズムもパフォーマンスに一定の影響を与えます。これらの要因が組み合わさって、Go はアレイ アクセス マイクロベンチマークで 4 倍のパフォーマンス低下を被ることになりました。

質問の内容

このマイクロベンチマークは、go のパフォーマンス特性をよりよく理解し、いつ使用するかについて十分な情報に基づいた選択ができるようにするために作成しました。

パフォーマンスのオーバーヘッドの観点から、これが Go にとって理想的なシナリオだと思います:

  • ループ内での割り当て/解放はありません
  • 配列アクセスは明らかに境界内にあります (境界チェックは削除できます)

それにもかかわらず、amd64 の gcc -o3 と比較して 4 倍の速度差が見られました。何故ですか?

(シェルタイミングを使用します。毎回数秒かかるため、起動は無視できます)

リーリー

c バージョン:

リーリー

更新:

  • 推奨に従って range を使用すると、移動速度が 2 倍になります。
  • 一方、-march=native を使用すると、私のテストでは c が 2 倍高速になりました。 (そして -mno-sse はコンパイル エラーを引き起こします。どうやら -o3 と互換性がありません)
  • gccgo は、ここでは gcc と同等に見えます (range は必要ありません)

解決策

少なくとも私が使用している Go および GCC のバージョン (1.19.6 および 12.2.0) で、C プログラムと Go プログラムのアセンブラー出力を確認してください。それぞれ)、最も直接的で明白な違いは、GCC は C プログラムを自動的にベクトル化するのに対し、Go コンパイラーはこれを行うことができないようです。

これは、特定のアーキテクチャをターゲットにしていない場合、GCC は AVX ではなく SSE を使用するため、パフォーマンスが 4 倍向上する理由もよく説明しています。これは、32 ビット スカラー命令幅が動作幅の 4 倍であることを意味します。実際、-march=native を追加すると、GCC が CPU 上で AVX コードを出力するようになるため、パフォーマンスが 2 倍向上しました。

私は Go コンパイラーが本質的に自動ベクトル化を実行できないのか、それともこの特定のプログラムだけが何らかの理由でエラーを引き起こしているのかを説明できるほど Go に詳しくありませんが、それが根本的な原因のようです。

以上がこの配列アクセス マイクロベンチマークで (GCC と比較して) Go の 4 倍のパフォーマンス低下の原因は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

GOの浮動小数点番号操作に使用されるライブラリは何ですか? GOの浮動小数点番号操作に使用されるライブラリは何ですか? Apr 02, 2025 pm 02:06 PM

GO言語の浮動小数点数操作に使用されるライブラリは、精度を確保する方法を紹介します...

Go's Crawler Collyのキュースレッドの問題は何ですか? Go's Crawler Collyのキュースレッドの問題は何ですか? Apr 02, 2025 pm 02:09 PM

Go Crawler Collyのキュースレッドの問題は、Go言語でColly Crawler Libraryを使用する問題を調査します。 �...

GOのどのライブラリが大企業によって開発されていますか、それとも有名なオープンソースプロジェクトによって提供されていますか? GOのどのライブラリが大企業によって開発されていますか、それとも有名なオープンソースプロジェクトによって提供されていますか? Apr 02, 2025 pm 04:12 PM

大企業または有名なオープンソースプロジェクトによって開発されたGOのどのライブラリが開発されていますか? GOでプログラミングするとき、開発者はしばしばいくつかの一般的なニーズに遭遇します...

GO言語の「VAR」と「タイプ」キーワード定義構造の違いは何ですか? GO言語の「VAR」と「タイプ」キーワード定義構造の違いは何ですか? Apr 02, 2025 pm 12:57 PM

GO言語で構造を定義する2つの方法:VARとタイプのキーワードの違い。構造を定義するとき、GO言語はしばしば2つの異なる執筆方法を見ます:最初...

Redisストリームを使用してGO言語でメッセージキューを実装する場合、user_idタイプの変換の問題を解決する方法は? Redisストリームを使用してGO言語でメッセージキューを実装する場合、user_idタイプの変換の問題を解決する方法は? Apr 02, 2025 pm 04:54 PM

redisstreamを使用してGo言語でメッセージキューを実装する問題は、GO言語とRedisを使用することです...

Goでは、Printlnとstring()関数を備えた文字列を印刷すると、なぜ異なる効果があるのですか? Goでは、Printlnとstring()関数を備えた文字列を印刷すると、なぜ異なる効果があるのですか? Apr 02, 2025 pm 02:03 PM

Go言語での文字列印刷の違い:printlnとstring()関数を使用する効果の違いはGOにあります...

GoおよびViperライブラリを使用するときにポインターを渡す必要があるのはなぜですか? GoおよびViperライブラリを使用するときにポインターを渡す必要があるのはなぜですか? Apr 02, 2025 pm 04:00 PM

ポインター構文とviperライブラリの使用における問題への取り組みGO言語でプログラミングするとき、特にポインターの構文と使用を理解することが重要です...

GO言語の範囲を使用してマップを通過してマップを保存するのに、なぜすべての値が最後の要素になるのですか? GO言語の範囲を使用してマップを通過してマップを保存するのに、なぜすべての値が最後の要素になるのですか? Apr 02, 2025 pm 04:09 PM

GOのマップイテレーションにより、すべての値が最後の要素になるのはなぜですか? Go言語では、いくつかのインタビューの質問に直面したとき、あなたはしばしば地図に遭遇します...

See all articles