out。"/> out。">
Go でのファイルの読み取りと書き込みが Perl よりもはるかに遅いのはなぜですか?これは、これら 2 つのプログラミング言語を使用するときに多くの開発者が遭遇する一般的な問題です。この記事では、PHPエディターのいちごがそんな疑問にお答えします。 Go と Perl の間でファイルの読み取りおよび書き込みの速度を比較する場合、言語機能と基盤となる実装という 2 つの重要な要素を考慮する必要があります。ファイルの読み取りと書き込みに関する Go 言語の設計思想は Perl の設計思想とは異なり、それがパフォーマンスの違いにつながります。同時に、基礎となる実装も読み取りおよび書き込み速度に影響を与える重要な要素です。次に、Go でのファイルの読み取りと書き込みが Perl よりもはるかに遅い理由をよりよく理解できるように、これらの要因を詳細に分析します。
コードの効率を上げるために go を使っているのですが、ファイルの読み書きに go を使ってみると、perl ほど読み書き効率が高くないことが分かりました。コードに問題があるのでしょうか、それとも他の理由でしょうか?
入力ファイルのビルド:
リーリーperl を使用してファイルを読み書きする:
リーリー リーリーファイルの読み取りと書き込みには go を使用します:
リーリーそれから私は実行します:
リーリー リーリーGo の読み取りおよび書き込み速度が Perl よりも 10 倍近く遅いのはなぜですか?
あなたはリンゴとオレンジを比較しています。
少なくとも 2 つのメソッド エラーがあります:
あなたの Perl スペルの測定方法 cat
ファイルを読み取り、その内容を pipe(2) 経由で送信する方法
while perl
そこからデータを読み取り、処理し、結果を標準出力に書き込みます。
あなたのGoの呪文
fmt.print*
呼び出し) を測定します - Documentation を引用 - "端末に出力される場合、通常は行バッファリング、それ以外の場合はブロックバッファリング。"
リンゴとリンゴを比較してみましょう。
まず、同様の go 実装を次に示します:
リーリー それを chomp.go
として保存して測定しましょう:
ビルドコード:
$ chomp.goをビルドしてみよう
入力ファイルの生成:
$ for i in $(seq 1 600000);エコーサーバーを実行$((random�0 100)),$random,$random,$random;Complete>sample.csv
Perl コードを実行します:
リーリーもう一度実行して、ファイル システム キャッシュから入力ファイルを読み取ったことを確認します:
リーリー実行時間がどのように短縮されるかに注目してください。
キャッシュされた入力で go コードを実行:
リーリー結果が同じであることを確認してください:
$ 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 インタプリタが実際に (非常に単純な) スクリプトを 解釈するのに対し、chomp と
print はいわゆる「組み込み関数」であることです。 」をインタプリタによるスクリプト実行用に簡単に提供できます。コンパイラーがソース コード ファイルを解析してマシン コードに変換する go プログラムの構築とは対照的に、リンカーは実際に go 標準ライブラリのコンパイル済みパッケージのファイルを読み取ります (すべて
import です)。編集者によると、 - このマシン コードをすべて結合して、実行可能イメージ ファイル (
perl バイナリ自体によく似ています!) を書き出します。もちろん、これは非常にリソースを大量に消費するプロセスであり、何もする必要はありません。実際のプログラムの実行を行います。
以上がGo でのファイルの読み取りと書き込みは Perl よりもはるかに遅いのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。