多くの計算を行うソフトウェアを作成する必要があります。ほとんどの場合、DCT を計算するための整数による行列乗算になります。ネイティブ C でコードを実行すると、VB .Net と比較してどれくらい速く実行できると期待できますか? 2倍、10倍、1000倍…?誰かがこれについて統計を試みて収集しましたか?
3 に答える
.Netコードは、実行前にネイティブコードにJITコンパイルされるため、一般的にネイティブコードより遅くなることはありません。ファクターは10未満だと思います。
さらに、適応最適化手法は、実行時にコードのプロファイルを作成し、通常の静的コンパイラよりも多くの情報を取得します。したがって、JITは、さらなる最適化のために、より多くの情報に基づいた決定を下すことができます。
.NET コードは JIT コンパイラによってネイティブ コードにコンパイルされるため、どちらの場合もネイティブ コードを取得できます。
違いは、C コードの方が計算に関するオーバーヘッドがやや少ないことです。そのため、おそらく 2 倍のパフォーマンスの違いを期待する必要があります。
VB は C よりも 93.7% 高速です。適切なシナリオを選択した場合。
実際、「ネイティブ C」に malloc() と free() への定期的な呼び出しが含まれている場合、VB.Net のようなあらゆる種類の Gargage Collected 言語は文字通りその周りをぐるぐる回ります。GC は、内側のループで malloc よりも 10 倍高速になる可能性があります。
分解して C を使用する場合は、この問題を回避するために、新しい構造体を作成する代わりに、一度だけ宣言した構造体を再利用するようにしてください。これは、ソリューションが適している場合、VB でも役立つ場合があります。ただし、プログラミングは難しく、GC は非常に高速です。
境界/オーバーフロー チェックに関しては、速度が重要であり、テストによってそれらが発生しないことが明らかになり、エラーや異常終了によって生命や数百万ドルを危険にさらしていない場合、それらは時間の無駄です。しかし、それらを取り除くことができない場合でも、より迅速にプログラミングできる言語では、時間の価値がさらに高くなる可能性があります。
深刻なサイズと使用量が予想される場合は、制御プログラムでタスクを分割し、割り当てられた「タスク定義」を、タスク ソルバーごとのファイルまたはデータベースを含む共有ディレクトリに格納することをお勧めします。次に、プロセッサごと (HT CPU ごとに 2 つ) またはネットワーク コンピューターごとにソルバーを実行できます。キュー構造にうんざりしてください。アトミックに「Mark-Taken-And-Get-Data-If-Not-Taken」を実行するのは困難です。開始するタスク ソルバーの数はわかっています。私が開発したイメージング ユーティリティを使用してこれを行いましたが、予想よりもはるかに簡単で、以前のバージョンよりも優れていました。さらに、適切に分割可能な問題領域で複数のプロセスを使用すると、マルチスレッド化によるわずかからかなりのプログラミングの負担を回避できます。または、中括弧が適切な場所にあることを同僚に納得させます。平和。