言語Xが言語Yよりも速いという記事を見つけた場合は、その記事を閉じることができます。





私の人道的な頭脳で、私はいつもこのように考えました-プログラマーがそれをより高性能にする方法を知っているなら、それはより高性能にされなければなりません。生産的なソリューション=適切なソリューション。あるプログラミング言語は別のプログラミング言語よりも遅くなる可能性があり、それが判明した場合、プログラミング言語は無駄になります。



確かに、開発者がパフォーマンススペシャリストであれば、たとえ間違っていたとしても、これらすべてに溺れるでしょう。



当然、これはすべてナンセンスですが、私がそれについてあなたに話すことはありません。そのため、開発者で数学者であり、物理科学と数学科学の候補者であり、BenchmarkDotNetのメンテナーであり、Pro .NET Benchmarkingの著者であり、非常にクールなエンジニアであるAndreyAkinshinがポッドキャストに来ました。





以下は選択された引用です。



ベンチマークですべてを予測することは不可能です



私の同僚は最近次のようになりました。彼は午前中にプログラミングをしていて、すべてが彼と一緒に大丈夫でした、すべてがすぐに働きました。ある時点で、すべてが固執し始めました-ライダーは遅いです、IDEA、ブラウザ-すべてが遅いです。彼はどうしたのか全く理解できなかったのですか?そして気づきました。彼は窓際に立っている黒いラップトップに取り組んだ。午前中はかなり涼しく、午後は太陽が昇り、ラップトップは非常に熱くなり、熱スロットルに入りました。



彼はそのようなことがあることを知っており、物理的な環境がパフォーマンスに影響を与える可能性があることを知っており、何が起こっているのかをすぐに理解しました。彼は頭の中に世界が機能するモデルを持っていました、そしてこのモデルの中で彼は多かれ少なかれ何が起こっているのかを素早く理解しました。



つまり、ベンチマークで取得できる最も重要なスキルは、すべての詳細(すべてのランタイムとすべてのハードウェア)のすべてを完全に把握しているわけではありません。重要なことは、問題を見つけるために、できれば最小限の労力でできるだけ早く行動する必要があることを理解することです。



言語との類似性を示します。最初の機能プログラミング言語を学ぶときは、世界に対する態度を少し変更する必要があります。機能プログラミングの原則、一般的にどのように考える必要があるかを理解するためです。次に、次の機能言語Xを使用すると、すでにこれらの原則が頭の中にあります。あなたはカップルのハローワールドを見て、書き始めます。



同時に、あなたは言語のニュアンスのいくつかを知らないかもしれません。特定の構文構造がどのように機能するかを知らないかもしれませんが、それはそれほど気になりません。あなたは快適に感じて書く。私は理解できない行動に直面しました-私はマニュアルを読んでそれを理解しました、新しい事実があなたの世界の絵に簡単に入りました、そしてあなたはさらに進んだ。そして、あなたは世界のすべての機能言語のすべてのニュアンスを学ぶことは決してありませんが、一般的なアプローチはあなたの頭の中に残ります。



それぞれの分野で同じレベルに到達してから、幅を広げる必要があると思います。



ベンチマークのある時点で、私は特に測定精度、特定のランタイムの機能、鉄片などに焦点を当てました。それから私は毎回自分自身でアメリカを発見するのをやめました、そしてすべてのパフォーマンスの問題は私がすでに知っていたクラスに分類され始めました。そして、私は広範囲に行きました-パフォーマンス分析の方向に:私たちが測定した数値をどうするか。そして、これは私がまだ知識の瀬戸際に達していない領域です。いくつかのことがすでに明らかになっていますが、まだ大きな作業があります。これらすべてを実際に適用する方法、使用する式、使用しない方法、適切なアプローチと不適切な方法を理解することです。



ベンチマークのためのベンチマークは最善の方法ではありません



常にいくつかのビジネスパフォーマンス要件が必要であり、何を目指しているかを常に理解する必要があります。ビジネス要件がない場合は、パフォーマンスを実行しても意味がありません。したがって、ビジネス要件がある場合、少なくとも目で見て、使用できるアプローチと使用できないアプローチをすでに理解し始めています。そうでない場合は、ベンチマークを行い、チェックします。どのアプローチが要件に適合しますか。



そして、一連のアルゴリズム、コードを書くためのオプション、デザインなどがあり、すべてが要件に適合している場合、コードを正しく書く方法についての美学に対するあなたの見解を反映する、プロジェクトの他の部分とより一貫性のあるものをすでに選択しています..。



大まかに言えば、コレクションに最大10個の要素があり、2つのオプション(キューブの単純なアルゴリズムを作成するか、n * log nの非常に複雑なアルゴリズムを作成する)がある場合、誰にでもわかりやすく、保守と変更が簡単な、キューブの単純なアルゴリズムを作成します。彼が私のパフォーマンスの制限を突破することは決してないことを私は理解しているからです。



小さなデータセットに対して遅いソリューションを作成し、それを大きなデータセットに使用し、それが非常に悪い結果をもたらさなかった場合(通常はそうではありません)-まあ、それを修正しましょう。しかし、頭の中には、将来これらの間違いを回避する方法のモデルがあります。



たとえば、コレクション内の要素の数がそのような数を超えないように、メソッドの最初にアサートを配置できます。次に、誤ってメソッドを使用しようとした次のプログラマーは、すぐに例外を確認し、それを使用しません。そのようなことには経験が伴います。



別の問題があります-不安定なビジネス要件。彼らは間違いなく変わるでしょう-これは私たちの現実の公理であり、これから逃れる方法はありません。経験を積むと、要件が変更される可能性のある場所、適切なレベルのパフォーマンスを設定する価値のある場所、負荷が増加する可能性のある場所を目で予測できます。



この直感はありませんが、試行錯誤を繰り返して何が起こるかを確認できます。



あなたは常にパフォーマンスと美しさの間のトレードオフを持っています



できるだけ効率的に書くと、おそらくコードはひどく嫌なものになります-美学に目を閉じても、維持するのは難しく、微妙なバグが絶えず現れます。アーキテクチャが悪い、コードが悪い、すべてが悪いからです。



現在のビジネス要件に焦点を合わせ、その中に最もクリーンで、最も理解しやすく、美しく、保守しやすいコードを書く必要があると思います。そして、それが刈り取り始めた瞬間(またはすぐに始まりそうな気がします)、それから何かがすでに変化しています。



また、常にパフォーマンスのみに集中している場合でも、完全に最適化された、最大限に生産性の高いコードなどはありません。それはすべてを意味します-彼らはC#を忘れ、すべての美しい言語を忘れました。また、アセンブラーの構文も制限されているため、一般的にはマシンコードで記述することをお勧めします。そして、すぐにバイトに書き込むと、パフォーマンスが向上します。



場合によっては、最速のコードが最も美しく、最も明白で、最も正確であることがわかります。しかし、そのようなトレードオフは必然的に数十、数百の小さな瞬間に発生します。配列境界違反をチェックするようなものがあるとしましょう。ランタイムがすべての場所で配列の範囲外をチェックするように処理することに同意できます。最初の要素のマイナスに目を向けると、例外が発生し、メモリの左側のチャンクから読み取ることができなくなります。



そして、間違いなく間違ったメモリから差し引くことは決してないというこの自信のために、あなたは小さなパフォーマンスで支払います。つまり、プログラムをより安定させ、理解しやすく、保守しやすくするために、パフォーマンスをリソースとして使用します。



言語にはパフォーマンスなどの特性はありません



XがYよりも速い記事を見つけた場合は、その記事を閉じることができます。言語は数学的な抽象化です。これは、プログラムのコンパイルに使用される一連のルールです。パフォーマンスもパフォーマンスもありません。頭の中に存在し、テキストエディタで具体化されているものです。



パフォーマンスは、特定のランタイム、環境、特定のプログラム、および特定のapisheで利用できます。これらすべての要素を考慮に入れると、パフォーマンスについて話すことができます。しかし、組み合わせの爆発的な増加があり、新しいバージョンのハードウェアとランタイムがリリースされているため、この言語の1つのコードがこの言語の別のコードよりも常に高速であるとは言えません。あなたはあなたの人生で外的要因のすべての可能な組み合わせを経験することは決してありません。使用するアピッシュは根本的に異なります。



たとえば、開発の初期段階の条件付き言語では、バブルを使用して並べ替える方法を実装しました。まあ、私にはわかりません-彼らはできるだけ早くリリースを展開したいと思っていました、彼らができる最も簡単なソートを書きました。あなたはこの方法を採用し、使用しましたが、クイックソートが行われる別の言語よりもビッグデータの方が遅いことがわかりました。これは、いくつかの言語のパフォーマンスについて話すことができるという意味ですか?番号。このオペレーティングシステム、このハードウェア、これらの環境でのこの言語からのこの特定のapishは、別の環境での別の言語からの別のapishよりも動作が遅いと言えます。だからあなたは言うことができます。しかし、正しく定式化するには、非常に長いテキストの段落であることがわかります。



従来、C ++はほとんどの場合JavaScriptよりも高速であると言えます。しかし、C ++で書くC ++の経験が豊富なC ++プログラマーは、JavaScriptjavascriptorがブラウザーで動作するものを書くよりも速いと思われるプログラムを書くと言った方が正しいでしょう。



しかし、ここには多くの予約もあります。しかし、JavaScriptで書いた人物がそうではないと言って、そこにある種のWebAssemblyまたは他の何かに行ってやり直した場合はどうなるでしょうか。または、GitHubで、3つ半の構文構造によってJSの非常に切り捨てられたサブセットで動作するが、超高速のネイティブコードを生成するJavaScriptスーパーインタープリターコンパイラを見つけます。



そして、必要に応じて、C ++を追い抜くコードを書くことができます。さらに、独自のJavaScriptコンパイラを作成できます。このコンパイラは、単一のプログラムをコンパイルして、速度の「プラス」を超えるように設計されています。そして、これは原則として有効なオプションです。



人気のあるオープンソースプロジェクトの社会的圧力



プロジェクトの成長と人気に伴い、ある程度の責任が伴います。しかし、あなたには本当に義務はありません。この事実は、特にあらゆる種類の人々がGitHubに来て、次のように言う場合、必ずしも理解しやすいとは限りません。早急に直してください!私は本当にこれが機能する必要があります。行って修正してください!」または、男が仕事に就き、私は休暇中です。 3、4日経ちましたが、彼がそこで何かを始めたのを見ることさえありませんでした。私はどこかで休んでいて、男は始まります-「なぜあなたは私に答えないのですか?このプロジェクトにはどのようなコミュニティがありますか?!あなたは一般的にすべて嫌な人です、あなたはあなたと悪いことをしなければなりません!私は時間を無駄にし、あなたが間違っているとあなたに書きました、そしてあなたはそれで何もしていません、あなたは4日間私を無視してきました!そんなことがあるものか ?! "



そして、プロジェクトの人気が高いほど、オープンソースは他の人があなたのために無料で仕事をする場所であると信じている人々からの社会的圧力が高まります。しかし、実際にはそうではありません。



そして今、あなたに何かを求めている人々に対して免疫が現れると、人生はずっと楽になります。コーディングする時間と気分があれば、BenchmarkDorNetにアクセスできます。そこにはたくさんのバグがあることを私は知っています。それらはほとんど重要ではなく、ある種の限界的なケースに関係します-5番目のDotNetの最新のプレビューがあるそのような環境では、どこかで何かが機能しません。まあ、大丈夫、それが機能しないようにします。気分が良ければ直しに行きます。



他の人がそれを必要とする場合、彼らはそれを自分で修正してプルリクエストを送ることができます-私は時間と気分があればレビューをします。






見るここで全体のポッドキャストを



All Articles