TL; DR古い落語で.decode
は、約100倍高速です。
コードと一致する長い形式:
sub fileToCorrectUTF8Str ($fileName) { # binary file
slurp($fileName, :bin).decode
}
パフォーマンスノート
最初に、これは私がテストのために書いたものです:
# Create million and 1 bytes long file:
spurt 'foo', "1234\n6789\n" x 1e5 ~ 'Z', :bin;
# (`say` the last character to check work is done)
say .decode.substr(1e6) with slurp 'foo', :bin;
# fileToCorrectUTF8Str 'foo' );
say now - INIT now;
TIO.runのOn 2018.12
rakudo、上記.decode
の重さおよそ.05
百万バイトのファイルあたりの秒の代わりに約5
ソリューションのための秒。
もちろん、システムでテストしたり、rakudoの新しいバージョンを使用したりできます。私は違いが同じ順序のままであることを期待しますが、年が経つにつれ絶対時間は著しく改善されます。[1]
なぜ100倍速いのですか?
さて、まず、@
上Buf
/ Blob
明示的力はかつて表示するRAKU 単一の項目(のようにバッファ)の複数のもの(リスト別名要素の複数の項目秒)。つまり、100万要素のバッファーの場合、1回の高レベルの操作ではなく、すぐに100万回の高レベルの反復/操作になる高レベルの反復を意味します。
第2に、使用すると.decode
反復が回避されるだけでなく、ファイルごとに1回だけメソッド呼び出しのオーバーヘッドが比較的遅くなるのに対して、反復処理を行う.chr
とファイルごとに100万回の呼び出しが発生する可能性があります。メソッドの呼び出しは(少なくとも意味論的に)遅延バインドされており、これは、たとえば、メソッドの代わりにsubを呼び出す場合と比較して、原則として比較的コストがかかります(subは通常、事前バインドされています)。
それはすべて言った:
あるBuf.Str
エラーメッセージLTAは?
更新 Liz ++のコメントを参照してください。
あなたが使用しようとした場合.Str
にBuf
、またはBlob
(など使用して、または同等の~
それに接頭辞を)あなたは例外を取得します。現在のメッセージは:
Cannot use a Buf as a string, but you called the Str method on it
以下のためのドキュメント.Str
上のBuf
/はBlob
現在、こう述べています。
Strに変換するには、を使用する必要があります.decode
。
エラーメッセージが同じことを示唆していないのは間違いなくLTAです。
その後、再び、このことについてどうするかを決定する前に、どちらかといえば、私たちは何を、どのように、フォークを検討する必要がある可能性がエラーメッセージなど、それについての信号を含め、うまくいかないものから学び、また何をどのように行う中を事実は現在学習しており、適切な文化とインフラストラクチャの構築に向けて私たちの反応にバイアスをかけています。
特に、人々が彼らが見るエラーメッセージとそれについて詳しく説明するオンラインディスカッションとの間を簡単に結びつけることができるなら、それは考慮に入れられ、おそらく奨励および/またはより簡単にされる必要があります。
たとえば、このSOがこの問題をカバーしていて、エラーメッセージが含まれているため、グーグルは誰かをここに連れてくる可能性があります。エラーメッセージを変更するよりも、それを利用する方が適切な場合があります。またはそうでないかもしれません。変更は簡単です...
以下のコメントや既存の落語の問題を検索して、Buf.Str
エラーメッセージの改善が検討されているかどうか、および/または問題を開いて変更を提案するかどうかを確認してください。動くすべての岩は少なくとも素晴らしい運動であり、私たちの集団的努力がますます賢くなるにつれて、山を改善します(私たちの見方)。
脚注
[1]ラテン語で「Caveat Empty」がよく知られているように、特定のraku機能、より一般的には特定のコードの絶対的および相対的なパフォーマンスは、システムの機能、その間の負荷などの要因により常に変動します。コードの実行、およびコンパイラーによる最適化。したがって、たとえば、システムが「空」の場合、コードの実行が速くなる可能性があります。または、別の例として、コンパイラが速くなるまで1〜3年待つと、rakudoのパフォーマンスの向上は引き続き有望に見えます。