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

王林
リリース: 2024-02-09 21:30:24
転載
865 人が閲覧しました

为什么 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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:stackoverflow.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!