目次
質問内容
解決策
ホームページ バックエンド開発 Golang Go でのファイルの読み取りと書き込みは Perl よりもはるかに遅いのはなぜですか?

Go でのファイルの読み取りと書き込みは Perl よりもはるかに遅いのはなぜですか?

Feb 09, 2024 pm 09:30 PM
標準ライブラリ

为什么 Go 中读写文件比 Perl 慢很多?

Go でのファイルの読み取りと書き込みが Perl よりもはるかに遅いのはなぜですか?これは、これら 2 つのプログラミング言語を使用するときに多くの開発者が遭遇する一般的な問題です。この記事では、PHPエディターのいちごがそんな疑問にお答えします。 Go と Perl の間でファイルの読み取りおよび書き込みの速度を比較する場合、言語機能と基盤となる実装という 2 つの重要な要素を考慮する必要があります。ファイルの読み取りと書き込みに関する Go 言語の設計思想は Perl の設計思想とは異なり、それがパフォーマンスの違いにつながります。同時に、基礎となる実装も読み取りおよび書き込み速度に影響を与える重要な要素です。次に、Go でのファイルの読み取りと書き込みが Perl よりもはるかに遅い理由をよりよく理解できるように、これらの要因を詳細に分析します。

質問内容

コードの効率を上げるために go を使っているのですが、ファイルの読み書きに go を使ってみると、perl ほど読み書き効率が高くないことが分かりました。コードに問題があるのでしょうか、それとも他の理由でしょうか?

入力ファイルのビルド:

リーリー

perl を使用してファイルを読み書きする:

リーリー リーリー

ファイルの読み取りと書き込みには go を使用します:

リーリー

それから私は実行します:

リーリー リーリー

Go の読み取りおよび書き込み速度が Perl よりも 10 倍近く遅いのはなぜですか?

解決策

あなたはリンゴとオレンジを比較しています。

少なくとも 2 つのメソッド エラーがあります:

  1. あなたの Perl スペルの測定方法 cat ファイルを読み取り、その内容を pipe(2) 経由で送信する方法 while perl そこからデータを読み取り、処理し、結果を標準出力に書き込みます。

  2. あなたのGoの呪文

    • Go ツール チェーンの完全なビルド プロセスを測定します (コンパイル、リンク、実行可能イメージ ファイルの書き出しを含む) その後 を実行します コンパイルされたプログラムのコンポーネント、および
    • Perl コードで stdout に書き込み中の、バッファリングされていない stdout への書き込み (fmt.print* 呼び出し) を測定します - Documentation を引用 - "端末に出力される場合、通常は行バッファリング、それ以外の場合はブロックバッファリング。"

リンゴとリンゴを比較してみましょう。

まず、同様の go 実装を次に示します:

リーリー

それを chomp.go として保存して測定しましょう:

  1. ビルドコード:

    $ chomp.goをビルドしてみよう

  2. 入力ファイルの生成:

    $ for i in $(seq 1 600000);エコーサーバーを実行$((random�0 100)),$random,$random,$random;Complete>sample.csv

  3. Perl コードを実行します:

    リーリー
  4. もう一度実行して、ファイル システム キャッシュから入力ファイルを読み取ったことを確認します:

    リーリー

    実行時間がどのように短縮されるかに注目してください。

  5. キャッシュされた入力で go コードを実行:

    リーリー
  6. 結果が同じであることを確認してください:

    $ cmp out1.txt out2.txt

ご覧のとおり、SSD を搭載した私の linux/amd64 システムでは、結果はほぼ同じです。

さて、妥当な結果を得るには、各コマンドをたとえば 1000 回実行し、各バッチの結果を平均して数値を比較する必要があることも指摘しておきますが、これは次のことを証明するには十分だと思います。あなたのアプローチに問題があります。

もう 1 つ考慮すべき点: どちらのプログラムの実行時間もファイルシステム I/O によって圧倒的に支配されているため、go の方が速いと思うなら、その期待は根拠がありません。ほとんどの場合、プログラムは sleep します。 は、カーネル システムで read(2) および write(2) を呼び出します。 CPU 操作を伴う場合には (特にマルチコア システムを利用するように作成されている場合)、Go プログラムは Perl プログラムよりも高速である可能性がありますが、この例ではまったく当てはまりません。

ああ、明言されていない事実を明確にしておきます。ただし、go 言語仕様では aot が指定されておらず、go run は 1 回限りのギグ用のハックです。 Not 深刻な作業ではありますが、深刻なレベルの複雑さのコードは実行されません。つまり、 go-that-you-are-using はインタプリタ言語ではありませんが、 go run が利用できるため、そう見えるかもしれません。実際、これは通常の go build が行うことを実行し、結果の実行可能ファイルを実行して破棄します。

Perl は「ソース コード」も処理すると言いたくなるかもしれませんが、Perl インタプリタはスクリプトと Go のビルド ツールチェーンを処理するために高度に最適化されています - 他のほとんどのコンパイル済み言語と比較して信じられないほど高速ですが、このためには最適化されていません。
おそらく、より明白な違いは、Perl インタプリタが実際に (非常に単純な) スクリプトを 解釈するのに対し、chompprint はいわゆる「組み込み関数」であることです。 」をインタプリタによるスクリプト実行用に簡単に提供できます。コンパイラーがソース コード ファイルを解析してマシン コードに変換する go プログラムの構築とは対照的に、リンカーは実際に go 標準ライブラリのコンパイル済みパッケージのファイルを読み取ります (すべて import です)。編集者によると、 - このマシン コードをすべて結合して、実行可能イメージ ファイル (perl バイナリ自体によく似ています!) を書き出します。もちろん、これは非常にリソースを大量に消費するプロセスであり、何もする必要はありません。実際のプログラムの実行を行います。

以上がGo でのファイルの読み取りと書き込みは Perl よりもはるかに遅いのはなぜですか?の詳細内容です。詳細については、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)

C++で絶対値を使用する方法 C++で絶対値を使用する方法 May 06, 2024 pm 06:15 PM

C++ で絶対値を取得するには、次の 2 つの方法があります。 1. 組み込み関数 abs() を使用して、整数または浮動小数点型の絶対値を取得します。 2. 汎用関数 std::abs() を使用して、サポートされているさまざまな絶対値を取得します。データ型の絶対値を操作します。

C++でプライムは何を意味しますか C++でプライムは何を意味しますか May 07, 2024 pm 11:33 PM

prime は C++ のキーワードで、1 とそれ自体でしか割り切れない素数の型を示し、指定された値が素数であるかどうかを示すブール型として使用されます。 true、それ以外の場合は false。

C++ で std:: を使用する方法 C++ で std:: を使用する方法 May 09, 2024 am 03:45 AM

std は、標準ライブラリのコンポーネントを含む C++ の名前空間です。 std を使用するには、「using namespace std;」ステートメントを使用します。 std 名前空間からシンボルを直接使用するとコードを簡素化できますが、名前空間の汚染を避けるために必要な場合にのみお勧めします。

C++ におけるファブとは何を意味しますか C++ におけるファブとは何を意味しますか May 08, 2024 am 01:15 AM

fabs() 関数は、浮動小数点数の絶対値を計算し、負の符号を削除して正の値を返す C++ の数学関数です。浮動小数点パラメータを受け入れ、double 型の絶対値を返します。たとえば、fabs(-5.5) は 5.5 を返します。この関数は浮動小数点数を処理しますが、その精度は基盤となるハードウェアによって影響を受けます。

Javaのconfigってどういう意味ですか? Javaのconfigってどういう意味ですか? May 07, 2024 am 02:39 AM

Config は Java の構成情報を表し、通常は外部ファイルまたはデータベースに保存され、Java プロパティ、PropertyResourceBundle、Java 構成フレームワーク、またはサードパーティ ライブラリを通じて管理できます。その利点には、分離と柔軟性が含まれます。環境意識、管理性、拡張性。

_C言語での複雑な使い方 _C言語での複雑な使い方 May 08, 2024 pm 01:27 PM

複素数型は、C 言語で実数部と虚数部を含む複素数を表すために使用されます。その初期化形式は complex_number = 3.14 + 2.71i で、実数部は creal(complex_number) を通じてアクセスでき、虚数部は cimag(complex_number) を通じてアクセスできます。この型は、加算、減算、乗算、除算、剰余などの一般的な数学演算をサポートします。さらに、cpow、csqrt、cexp、csin など、複素数を処理するための一連の関数が提供されています。

C++でminは何を意味しますか C++でminは何を意味しますか May 08, 2024 am 12:51 AM

C++ の min 関数は、複数の値の最小値を返します。構文は次のとおりです: min(a, b)、a と b は比較される値です。 < 演算子をサポートしない型をサポートする比較関数を指定することもできます。 C++20 では、3 つ以上の最小値を処理する std::clamp 関数が導入されました。

C++で絶対値を計算する方法 C++で絶対値を計算する方法 May 06, 2024 pm 06:21 PM

C++ で絶対値を求める方法は 3 つあります。 abs() 関数を使用すると、あらゆるタイプの数値の絶対値を計算できます。 std::abs() 関数を使用すると、整数、浮動小数点数、および複素数の絶対値を計算できます。絶対値の手動計算。単純な整数に適しています。

See all articles